Commit 83efd49403c0a90a55c450c90105002d7f436bbd

Authored by wdn127929
1 parent 0706e987

UI& 短信验证码

import 'package:json_annotation/json_annotation.dart';
part 'phone_code_model.g.dart';
@JsonSerializable()
class PhoneCodeModel extends Object {
@JsonKey(name: 'ret')
int ret;
@JsonKey(name: 'data')
PhoneCodeSunModel data;
@JsonKey(name: 'msg')
String msg;
PhoneCodeModel(
this.ret,
this.data,
this.msg,
);
factory PhoneCodeModel.fromJson(Map<String, dynamic> srcJson) =>
_$PhoneCodeModelFromJson(srcJson);
Map<String, dynamic> toJson() => _$PhoneCodeModelToJson(this);
}
@JsonSerializable()
class PhoneCodeSunModel extends Object {
@JsonKey(name: 'RequestId')
String requestId;
@JsonKey(name: 'Message')
String message;
@JsonKey(name: 'BizId')
String bizId;
@JsonKey(name: 'Code')
String code;
PhoneCodeSunModel(
this.requestId,
this.message,
this.bizId,
this.code,
);
factory PhoneCodeSunModel.fromJson(Map<String, dynamic> srcJson) =>
_$PhoneCodeSunModelFromJson(srcJson);
Map<String, dynamic> toJson() => _$PhoneCodeSunModelToJson(this);
}
... ...
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'phone_code_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
PhoneCodeModel _$PhoneCodeModelFromJson(Map<String, dynamic> json) {
return PhoneCodeModel(
json['ret'] as int,
json['data'] == null
? null
: PhoneCodeSunModel.fromJson(json['data'] as Map<String, dynamic>),
json['msg'] as String);
}
Map<String, dynamic> _$PhoneCodeModelToJson(PhoneCodeModel instance) =>
<String, dynamic>{
'ret': instance.ret,
'data': instance.data,
'msg': instance.msg
};
PhoneCodeSunModel _$PhoneCodeSunModelFromJson(Map<String, dynamic> json) {
return PhoneCodeSunModel(
json['RequestId'] as String,
json['Message'] as String,
json['BizId'] as String,
json['Code'] as String);
}
Map<String, dynamic> _$PhoneCodeSunModelToJson(PhoneCodeSunModel instance) =>
<String, dynamic>{
'RequestId': instance.requestId,
'Message': instance.message,
'BizId': instance.bizId,
'Code': instance.code
};
... ...
... ... @@ -87,5 +87,7 @@ class HttpUrl {
"?service=App.Activity.GetCustomerActivityBaseinfo"; //客户经理获取基本信息
static const String get_seller_photo_by_id =
"?service=App.Photo.getSellerPhotoById"; //查看商家图片
static const String send_vc_code =
"?service=App.SendSMS.SendVcCode"; //绑定手机号码时,给用户发送短信验证码接口
}
... ...
... ... @@ -5,6 +5,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:image_picker/image_picker.dart';
import 'package:one_key/models/upload_img_model.dart';
import 'package:one_key/pages/create_store/video_widget.dart';
import 'package:one_key/pages/online_check/img_picker_widget.dart';
import 'package:one_key/pages/online_check/photo_view_wiget.dart';
import 'package:one_key/provider/upload_img_provider.dart';
import 'package:one_key/res/colors.dart';
... ... @@ -61,12 +62,57 @@ class _CreateStorePageState extends State<CreateStorePage> {
return list;
}
///店铺名称
///店铺电话
Widget _storePhoneWidget() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('2.您店铺的电话是?',
style: TextStyle(
fontSize: ScreenUtil().setSp(30), fontWeight: FontWeight.bold)),
VEmptyView(30),
TextField(
// textAlignVertical: TextAlignVertical.bottom,
maxLines: 1,
// //光标颜色
// cursorColor:
// widget.isSelect ? Colors.white : MyColours.color_199095,
//输入文本的样式
style: TextStyle(
fontSize: ScreenUtil().setSp(28),
),
// focusNode: _codeNode,
decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(
vertical: ScreenUtil().setWidth(6),
horizontal: ScreenUtil().setWidth(20)),
border: OutlineInputBorder(),
hintText: '请输入店铺接单电话',
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(28),
),
// enabledBorder: new UnderlineInputBorder(
// borderSide: BorderSide.none,
// ),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: MyColours.color_199095)),
),
onChanged: (value) {},
onEditingComplete: () {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.text,
)
],
);
}
Widget _storeNameWidget() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('1.您的店铺名称是?',
Text('1.您店铺的名称是?',
style: TextStyle(
fontSize: ScreenUtil().setSp(30), fontWeight: FontWeight.bold)),
VEmptyView(30),
... ... @@ -154,8 +200,8 @@ class _CreateStorePageState extends State<CreateStorePage> {
if (pickedFile != null) {
model.imgSizeTouxiang = 64;
model.touxiang.qiniuUrl = null;
UploadImageUtil().startUploadOnly(
context, File(pickedFile.path), title == '头像' ? 0 : 1, true, model);
UploadImageUtil().startUpload(context, File(pickedFile.path),
title == '头像' ? 0 : 1, true, model, UploadType.StoreFrontUploadType);
}
}
... ... @@ -339,12 +385,33 @@ class _CreateStorePageState extends State<CreateStorePage> {
);
}
///门头照片
Widget _storeFrontPhotoWidget() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('2.您店铺的门头照片是?',
style: TextStyle(
fontSize: ScreenUtil().setSp(30), fontWeight: FontWeight.bold)),
VEmptyView(30),
Consumer<UploadImageProvider>(builder: (context, model, _) {
return ImgPickerWidget(
scrollController: _controller,
model: model,
maxImageNumber: 1,
uploadType: UploadType.StoreFrontUploadType,
);
})
],
);
}
///店铺环境
Widget _storeEnvironmentWidget() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('4.请上传您店铺环境的照片或者视频',
Text('2.请上传您店铺环境的照片或者视频',
style: TextStyle(
fontSize: ScreenUtil().setSp(30), fontWeight: FontWeight.bold)),
VEmptyView(30),
... ... @@ -388,6 +455,10 @@ class _CreateStorePageState extends State<CreateStorePage> {
// Column(children: _roomTypeWidget()),
_storeNameWidget(),
VEmptyView(30),
_storeFrontPhotoWidget(),
VEmptyView(30),
_storePhoneWidget(),
VEmptyView(30),
_addressWidget(),
VEmptyView(30),
_positionWidget(),
... ...
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:permission_handler/permission_handler.dart';
class EnterStoreAddressPage extends StatefulWidget {
EnterStoreAddressPage({Key key}) : super(key: key);
@override
_EnterStoreAddressPageState createState() => _EnterStoreAddressPageState();
}
class _EnterStoreAddressPageState extends State<EnterStoreAddressPage> {
String storeAddress = '请选择地图地址';
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: SystemAppBar(
'',
leftTitle: '上一步',
onTap: () {
Navigator.pop(context);
},
),
body: InkWell(
onTap: () {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
},
child: Container(
padding: EdgeInsets.fromLTRB(ScreenUtil().setWidth(70),
ScreenUtil().setWidth(60), ScreenUtil().setWidth(70), 0),
child: SingleChildScrollView(
// controller: _controller,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('您的店铺地址在哪?',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(40),
fontWeight: FontWeight.bold)),
VEmptyView(100),
InkWell(
onTap: () {
Utils.getPickPermission(context, () async {
Map address =
await NavigatorUtil.goMapChoicePointPage(
context);
if (address != null) {
setState(() {
storeAddress = address['address'];
// 'address':
// 'lat':
// 'lng
});
}
}, PermissionGroup.location);
},
child: Container(
alignment: Alignment.centerLeft,
width: double.infinity,
height: ScreenUtil().setWidth(104),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(
ScreenUtil().setWidth(10)),
border: Border.all(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2))),
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40),
),
child: Text('${storeAddress}',
style: TextStyle(
color: storeAddress == '请选择地图地址'
? MyColours.color_999999
: MyColours.color_333333,
fontSize: ScreenUtil().setSp(28),
)),
),
),
VEmptyView(20),
TextField(
// textAlignVertical: TextAlignVertical.bottom,
maxLines: 1,
// //光标颜色
// cursorColor:
// widget.isSelect ? Colors.white : MyColours.color_199095,
//输入文本的样式
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(28),
),
// focusNode: _codeNode,
decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(
vertical: ScreenUtil().setWidth(32),
horizontal: ScreenUtil().setWidth(40)),
border: OutlineInputBorder(),
hintText: '请输入详细地址(选填)',
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(28),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2))),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2))),
),
onChanged: (value) {},
onEditingComplete: () {
FocusScope.of(context)
.requestFocus(FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.text,
),
VEmptyView(160),
RoundButton(
text: '下一步',
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
// borderColor: MyColours.color_999999,
radius: ScreenUtil().setWidth(20),
fontSize: 28,
isBold: false,
onPressed: () {
NavigatorUtil.goEnterStorePositionPage(context);
},
)
])))));
;
}
}
... ...
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/pages/create_store/video_widget.dart';
import 'package:one_key/pages/online_check/img_picker_widget.dart';
import 'package:one_key/provider/upload_img_provider.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/utils/upload_image_util.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:provider/provider.dart';
class EnterStoreEnvironmentPage extends StatefulWidget {
EnterStoreEnvironmentPage({Key key}) : super(key: key);
@override
_EnterStoreEnvironmentPageState createState() =>
_EnterStoreEnvironmentPageState();
}
class _EnterStoreEnvironmentPageState extends State<EnterStoreEnvironmentPage> {
ScrollController _controller = ScrollController();
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: SystemAppBar(
'',
onTap: () {
Navigator.pop(context);
},
),
body: InkWell(
onTap: () {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(70),
vertical: ScreenUtil().setWidth(60)),
child: SingleChildScrollView(
controller: _controller,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('请上传店内环境照片或视频(选传)',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(40),
fontWeight: FontWeight.bold)),
VEmptyView(100),
Consumer<UploadImageProvider>(
builder: (context, model, _) {
return VideoPickerWidget(
maxImageNumber: 9,
model: model,
scrollController: _controller);
}),
VEmptyView(160),
RoundButton(
text: '下一步',
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
// borderColor: MyColours.color_999999,
radius: ScreenUtil().setWidth(20),
fontSize: 28,
isBold: false,
onPressed: () {
NavigatorUtil.goEnterStoreAddressPage(context);
},
)
])))));
;
}
}
... ...
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/pages/online_check/img_picker_widget.dart';
import 'package:one_key/provider/upload_img_provider.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/utils/upload_image_util.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:provider/provider.dart';
class EnterStoreFrontPhotoPage extends StatefulWidget {
EnterStoreFrontPhotoPage({Key key}) : super(key: key);
@override
_EnterStoreFrontPhotoPageState createState() =>
_EnterStoreFrontPhotoPageState();
}
class _EnterStoreFrontPhotoPageState extends State<EnterStoreFrontPhotoPage> {
ScrollController _controller = ScrollController();
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: SystemAppBar(
'',
onTap: () {
Navigator.pop(context);
},
),
body: InkWell(
onTap: () {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(70),
vertical: ScreenUtil().setWidth(60)),
child: SingleChildScrollView(
controller: _controller,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('请上传店铺的门头照片(选传)',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(40),
fontWeight: FontWeight.bold)),
VEmptyView(100),
Consumer<UploadImageProvider>(
builder: (context, model, _) {
return ImgPickerWidget(
scrollController: _controller,
model: model,
maxImageNumber: 1,
uploadType: UploadType.StoreFrontUploadType,
);
}),
VEmptyView(160),
RoundButton(
text: '下一步',
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
// borderColor: MyColours.color_999999,
radius: ScreenUtil().setWidth(20),
fontSize: 28,
isBold: false,
onPressed: () {
NavigatorUtil.goEnterStoreEnvironmentPage(
context);
},
)
])))));
;
}
}
... ...
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
class EnterStoreNamePage extends StatefulWidget {
EnterStoreNamePage({Key key}) : super(key: key);
@override
_EnterStoreNamePageState createState() => _EnterStoreNamePageState();
}
class _EnterStoreNamePageState extends State<EnterStoreNamePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: SystemAppBar(
'',
onTap: () {
Navigator.pop(context);
},
),
body: InkWell(
onTap: () {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(70),
vertical: ScreenUtil().setWidth(60)),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('您的店铺名称是?',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(40),
fontWeight: FontWeight.bold)),
VEmptyView(100),
TextField(
// textAlignVertical: TextAlignVertical.bottom,
maxLines: 1,
// //光标颜色
// cursorColor:
// widget.isSelect ? Colors.white : MyColours.color_199095,
//输入文本的样式
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(28),
),
// focusNode: _codeNode,
decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(
vertical: ScreenUtil().setWidth(32),
horizontal: ScreenUtil().setWidth(40)),
border: OutlineInputBorder(),
hintText: '请输入店铺名称',
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(28),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2))),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2))),
),
onChanged: (value) {},
onEditingComplete: () {
FocusScope.of(context)
.requestFocus(FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.text,
),
VEmptyView(160),
RoundButton(
text: '下一步',
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
// borderColor: MyColours.color_999999,
radius: ScreenUtil().setWidth(20),
fontSize: 28,
isBold: false,
onPressed: () {
NavigatorUtil.goEnterStoreAddressPage(context);
},
)
])))));
;
}
}
... ...
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
class EnterStorePhonePage extends StatefulWidget {
EnterStorePhonePage({Key key}) : super(key: key);
@override
_EnterStorePhonePageState createState() => _EnterStorePhonePageState();
}
class _EnterStorePhonePageState extends State<EnterStorePhonePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: SystemAppBar(
'',
onTap: () {
Navigator.pop(context);
},
),
body: InkWell(
onTap: () {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(70),
vertical: ScreenUtil().setWidth(60)),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('确定将此电话作为接单电话吗?',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(40),
fontWeight: FontWeight.bold)),
VEmptyView(100),
TextField(
// textAlignVertical: TextAlignVertical.bottom,
maxLines: 1,
// //光标颜色
// cursorColor:
// widget.isSelect ? Colors.white : MyColours.color_199095,
//输入文本的样式
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(28),
),
// focusNode: _codeNode,
decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(
vertical: ScreenUtil().setWidth(32),
horizontal: ScreenUtil().setWidth(40)),
border: OutlineInputBorder(),
hintText: '请输入接单电话',
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(28),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2))),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2))),
),
onChanged: (value) {},
onEditingComplete: () {
FocusScope.of(context)
.requestFocus(FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.text,
),
VEmptyView(160),
RoundButton(
text: '下一步',
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
// borderColor: MyColours.color_999999,
radius: ScreenUtil().setWidth(20),
fontSize: 28,
isBold: false,
onPressed: () {
NavigatorUtil.goEnterStoreFrontPhotoPage(context);
},
)
])))));
;
}
}
... ...
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
class EnterStorePositionPage extends StatefulWidget {
EnterStorePositionPage({Key key}) : super(key: key);
@override
_EnterStorePositionPageState createState() => _EnterStorePositionPageState();
}
class _EnterStorePositionPageState extends State<EnterStorePositionPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: SystemAppBar(
'',
onTap: () {
Navigator.pop(context);
},
),
body: InkWell(
onTap: () {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(70),
vertical: ScreenUtil().setWidth(60)),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('您在店铺的角色是?',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(40),
fontWeight: FontWeight.bold)),
VEmptyView(100),
TextField(
// textAlignVertical: TextAlignVertical.bottom,
maxLines: 1,
// //光标颜色
// cursorColor:
// widget.isSelect ? Colors.white : MyColours.color_199095,
//输入文本的样式
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(28),
),
// focusNode: _codeNode,
decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(
vertical: ScreenUtil().setWidth(32),
horizontal: ScreenUtil().setWidth(40)),
border: OutlineInputBorder(),
hintText: '请输入您的职位',
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(28),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2))),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2))),
),
onChanged: (value) {},
onEditingComplete: () {
FocusScope.of(context)
.requestFocus(FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.text,
),
VEmptyView(160),
RoundButton(
text: '下一步',
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
// borderColor: MyColours.color_999999,
radius: ScreenUtil().setWidth(20),
fontSize: 28,
isBold: false,
onPressed: () {
NavigatorUtil.goEnterStoreTimePage(context);
},
)
])))));
;
}
}
... ...
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
class EnterStoreTimePage extends StatefulWidget {
EnterStoreTimePage({Key key}) : super(key: key);
@override
_EnterStoreTimePageState createState() => _EnterStoreTimePageState();
}
class _EnterStoreTimePageState extends State<EnterStoreTimePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: SystemAppBar(
'',
onTap: () {
Navigator.pop(context);
},
),
body: InkWell(
onTap: () {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(70),
vertical: ScreenUtil().setWidth(60)),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('您的店铺营业时间是?',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(40),
fontWeight: FontWeight.bold)),
VEmptyView(100),
TextField(
// textAlignVertical: TextAlignVertical.bottom,
maxLines: 1,
// //光标颜色
// cursorColor:
// widget.isSelect ? Colors.white : MyColours.color_199095,
//输入文本的样式
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(28),
),
// focusNode: _codeNode,
decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(
vertical: ScreenUtil().setWidth(32),
horizontal: ScreenUtil().setWidth(40)),
border: OutlineInputBorder(),
hintText: '请输入营业时间,如09:00-23:00',
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(28),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2))),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2))),
),
onChanged: (value) {},
onEditingComplete: () {
FocusScope.of(context)
.requestFocus(FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.text,
),
VEmptyView(160),
RoundButton(
text: '下一步',
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
// borderColor: MyColours.color_999999,
radius: ScreenUtil().setWidth(20),
fontSize: 28,
isBold: false,
onPressed: () {
NavigatorUtil.goEnterStorePhonePage(context);
},
)
])))));
;
}
}
... ...
... ... @@ -78,14 +78,19 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
imgModel.file = File(pickedFile.path);
imgModel.process = 0.01;
imgModel.fileType = FileType.image;
widget.model.imageList.add(imgModel);
widget.model.imageListDenvironment.add(imgModel);
} else {
print('No image selected.');
}
});
if (pickedFile != null) {
UploadImageUtil().startUpload(context, File(pickedFile.path),
widget.model.imageList.length - 1, true, widget.model);
UploadImageUtil().startUpload(
context,
File(pickedFile.path),
widget.model.imageListDenvironment.length - 1,
true,
widget.model,
UploadType.EnvironmentUploadType);
}
}
... ... @@ -116,10 +121,15 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
imgModel.fileType = FileType.video;
imgModel.thumbnailPath = thumbnailPath;
imgModel.duration = duration;
widget.model.imageList.add(imgModel);
widget.model.imageListDenvironment.add(imgModel);
setState(() {});
UploadImageUtil().startUpload(context, File(pickedFile.path),
widget.model.imageList.length - 1, true, widget.model);
UploadImageUtil().startUpload(
context,
File(pickedFile.path),
widget.model.imageListDenvironment.length - 1,
true,
widget.model,
UploadType.EnvironmentUploadType);
} else {
print('No image selected.');
}
... ... @@ -145,7 +155,8 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
// the check box disable color
itemRadio: 0.88,
// the content item radio
maxSelected: widget.maxImageNumber - widget.model.imageList.length,
maxSelected:
widget.maxImageNumber - widget.model.imageListDenvironment.length,
// max picker image count
// provider: I18nProvider.english,
provider: I18nProvider.chinese,
... ... @@ -180,12 +191,17 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
imgModel.file = File(file.absolute.path);
imgModel.process = 0.01;
imgModel.fileType = FileType.image;
widget.model.imageList.add(imgModel);
widget.model.imageListDenvironment.add(imgModel);
});
UploadImageUtil().startUpload(context, File(file.absolute.path),
widget.model.imageList.length - 1, false, widget.model);
UploadImageUtil().startUpload(
context,
File(file.absolute.path),
widget.model.imageListDenvironment.length - 1,
false,
widget.model,
UploadType.EnvironmentUploadType);
// startUpload(File(file.absolute.path),
// _uploadImageProvider.imageList.length - 1, false);
// _uploadImageProvider.imageListDenvironment.length - 1, false);
}
}
}
... ... @@ -293,11 +309,13 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
@override
Widget build(BuildContext context) {
return _getGridImg(
widget.model.imageList.length < widget.maxImageNumber
? widget.model.imageList.length + 2
: widget.model.imageList.length,
widget.model.imageListDenvironment.length < widget.maxImageNumber
? widget.model.imageListDenvironment.length + 2
: widget.model.imageListDenvironment.length,
context,
widget.model.imageList.length == widget.maxImageNumber ? true : false);
widget.model.imageListDenvironment.length == widget.maxImageNumber
? true
: false);
}
//查看大图
... ... @@ -423,17 +441,20 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
);
}
return widget.model.imageList.length < 1
return widget.model.imageListDenvironment.length < 1
? Text('')
: InkWell(
onTap: () {
if (widget.model.imageList[index].process == 1) {
if (widget.model.imageListDenvironment[index].process ==
1) {
widget.model.imageQiniuUrlList = [];
if (widget.model.imageList[index].qiniuUrl != null) {
if (widget.model.imageList[index].fileType ==
if (widget.model.imageListDenvironment[index].qiniuUrl !=
null) {
if (widget
.model.imageListDenvironment[index].fileType ==
FileType.image) {
List<UploadImgModel> temp = [];
temp.addAll(widget.model.imageList);
temp.addAll(widget.model.imageListDenvironment);
temp.removeWhere(
(element) => element.fileType == FileType.video);
for (int i = 0; i < temp.length; i++) {
... ... @@ -444,10 +465,12 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
///没有上传完成的不可以点击
_showPhotoView(
context, index, widget.model.imageQiniuUrlList);
} else if (widget.model.imageList[index].fileType ==
} else if (widget
.model.imageListDenvironment[index].fileType ==
FileType.video) {
NavigatorUtil.goPlayVideoPage(context,
urlStr: widget.model.imageList[index].qiniuUrl);
urlStr: widget
.model.imageListDenvironment[index].qiniuUrl);
}
}
}
... ... @@ -457,16 +480,18 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
Stack(
alignment: Alignment.topRight,
children: [
widget.model.imageList[index].fileType ==
widget.model.imageListDenvironment[index].fileType ==
FileType.image
? Image.file(
widget.model.imageList[index].file,
widget
.model.imageListDenvironment[index].file,
fit: BoxFit.cover,
width: ScreenUtil().setWidth(100 * 2),
height: ScreenUtil().setWidth(100 * 2),
)
: Image.file(
widget.model.imageList[index].thumbnailPath,
widget.model.imageListDenvironment[index]
.thumbnailPath,
fit: BoxFit.cover,
width: ScreenUtil().setWidth(100 * 2),
height: ScreenUtil().setWidth(100 * 2),
... ... @@ -498,7 +523,9 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
// ),
,
Offstage(
offstage: widget.model.imageList[index].process < 1,
offstage: widget.model.imageListDenvironment[index]
.process <
1,
child: GestureDetector(
child: Image.asset(
Utils.getImgPath("delete"),
... ... @@ -508,10 +535,11 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
onTap: () {
//点击删除按钮
setState(() {
widget.model.imageList.removeWhere(
(element) =>
widget.model.imageListDenvironment
.removeWhere((element) =>
element ==
widget.model.imageList[index]);
widget.model
.imageListDenvironment[index]);
widget.model.imageQiniuUrlList.removeWhere(
(element) =>
element ==
... ... @@ -524,11 +552,12 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
],
),
// Offstage(
// offstage: widget.model.imageList[index].process == 1,
// child: Progress(widget.model.imageList[index].process),
// offstage: widget.model.imageListDenvironment[index].process == 1,
// child: Progress(widget.model.imageListDenvironment[index].process),
// ),
widget.model.imageList[index].process == 1
? widget.model.imageList[index].fileType ==
widget.model.imageListDenvironment[index].process == 1
? widget.model.imageListDenvironment[index]
.fileType ==
FileType.video
? Align(
alignment: Alignment.center,
... ... @@ -537,8 +566,10 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
width: ScreenUtil().setWidth(40),
))
: Container()
: Progress(widget.model.imageList[index].process),
widget.model.imageList[index].fileType == FileType.video
: Progress(widget
.model.imageListDenvironment[index].process),
widget.model.imageListDenvironment[index].fileType ==
FileType.video
? Align(
alignment: Alignment.bottomRight,
child: Padding(
... ... @@ -546,7 +577,7 @@ class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
bottom: ScreenUtil().setWidth(10),
right: ScreenUtil().setWidth(10)),
child: Text(
'00:${widget.model.imageList[index].duration}',
'00:${widget.model.imageListDenvironment[index].duration}',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(24)),
... ...
import 'dart:async';
import 'package:common_utils/common_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/app.dart';
import 'package:one_key/provider/other_login_provider.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/utils/utils.dart';
... ... @@ -10,6 +12,7 @@ import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:provider/provider.dart';
class BindingPhone extends StatefulWidget {
BindingPhone({Key key}) : super(key: key);
... ... @@ -30,6 +33,8 @@ class _BindingPhoneState extends State<BindingPhone> {
String phone;
String code;
bool enabled = true; //手机号码框是否可以编辑
bool codeEnabled = false; //验证码是否可用
@override
void initState() {
... ... @@ -46,14 +51,18 @@ class _BindingPhoneState extends State<BindingPhone> {
}
///倒计时方法
startCountdown() {
Utils.showToast('短信验证码已发送,请注意查收');
countdownTime = 60;
startCountdown(OtherLoginProvider model) {
countdownTime = 300;
final call = (timer) {
setState(() {
if (countdownTime < 1) {
// model.code = null;
enabled = true;
codeEnabled = false;
_timer.cancel();
} else {
enabled = false;
codeEnabled = true;
countdownTime -= 1;
}
});
... ... @@ -85,179 +94,220 @@ class _BindingPhoneState extends State<BindingPhone> {
Expanded(
child: SingleChildScrollView(
controller: _controller,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('绑定您的手机号',
style: TextStyle(
fontWeight: FontWeight.bold,
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(40))),
VEmptyView(100),
Container(
height: ScreenUtil().setHeight(52 * 2),
// width: ScreenUtil().setWidth(611),
padding: EdgeInsets.only(
left: ScreenUtil().setWidth(20)),
margin: EdgeInsets.only(
top: ScreenUtil().setHeight(8)),
alignment: Alignment.center,
decoration: BoxDecoration(
border: Border.all(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2)),
borderRadius: BorderRadius.circular(
ScreenUtil().setWidth(10))),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
HEmptyView(30),
Text(
"手机号",
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(26)),
),
HEmptyView(30),
Expanded(
child: TextField(
focusNode: _phoneNode,
child: Consumer<OtherLoginProvider>(
builder: (context, model, _) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('绑定您的手机号',
style: TextStyle(
fontWeight: FontWeight.bold,
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(40))),
VEmptyView(100),
Container(
height: ScreenUtil().setHeight(52 * 2),
// width: ScreenUtil().setWidth(611),
padding: EdgeInsets.only(
left: ScreenUtil().setWidth(20)),
margin: EdgeInsets.only(
top: ScreenUtil().setHeight(8)),
alignment: Alignment.center,
decoration: BoxDecoration(
border: Border.all(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2)),
borderRadius: BorderRadius.circular(
ScreenUtil().setWidth(10))),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
HEmptyView(30),
Text(
"手机号",
style: TextStyle(
color: MyColours.color_353535,
fontSize: ScreenUtil().setSp(28)),
decoration: InputDecoration(
hintText: "请输入手机号",
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(26)),
border: InputBorder.none,
contentPadding: EdgeInsets.fromLTRB(
0,
ScreenUtil().setWidth(28),
ScreenUtil().setWidth(30),
ScreenUtil().setWidth(28)),
),
onChanged: (value) {
phone = value;
},
onEditingComplete: () {
FocusScope.of(context).requestFocus(
FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.number,
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(26)),
),
)
],
)),
VEmptyView(10),
Container(
height: ScreenUtil().setHeight(52 * 2),
// width: ScreenUtil().setWidth(611),
padding: EdgeInsets.only(
left: ScreenUtil().setWidth(20)),
margin: EdgeInsets.only(
top: ScreenUtil().setHeight(8)),
alignment: Alignment.center,
decoration: BoxDecoration(
border: Border.all(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2)),
borderRadius: BorderRadius.circular(
ScreenUtil().setWidth(10))),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
HEmptyView(30),
Text(
"验证码",
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(26)),
),
HEmptyView(30),
Expanded(
child: TextField(
focusNode: _codeNode,
HEmptyView(30),
Expanded(
child: TextField(
enabled: enabled,
focusNode: _phoneNode,
style: TextStyle(
color: MyColours.color_353535,
fontSize: ScreenUtil().setSp(28)),
decoration: InputDecoration(
hintText: "请输入手机号",
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(26)),
border: InputBorder.none,
contentPadding: EdgeInsets.fromLTRB(
0,
ScreenUtil().setWidth(28),
ScreenUtil().setWidth(30),
ScreenUtil().setWidth(28)),
),
onChanged: (value) {
phone = value;
},
onEditingComplete: () {
FocusScope.of(context).requestFocus(
FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.number,
),
)
],
)),
VEmptyView(10),
Container(
height: ScreenUtil().setHeight(52 * 2),
// width: ScreenUtil().setWidth(611),
padding: EdgeInsets.only(
left: ScreenUtil().setWidth(20)),
margin: EdgeInsets.only(
top: ScreenUtil().setHeight(8)),
alignment: Alignment.center,
decoration: BoxDecoration(
border: Border.all(
color: MyColours.color_bff6f7,
width: ScreenUtil().setWidth(2)),
borderRadius: BorderRadius.circular(
ScreenUtil().setWidth(10))),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
HEmptyView(30),
Text(
"验证码",
style: TextStyle(
color: MyColours.color_353535,
fontSize: ScreenUtil().setSp(28)),
decoration: InputDecoration(
hintText: "请输入验证码",
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(26)),
border: InputBorder.none,
contentPadding: EdgeInsets.fromLTRB(
0,
ScreenUtil().setWidth(28),
ScreenUtil().setWidth(30),
ScreenUtil().setWidth(28)),
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(26)),
),
HEmptyView(30),
Expanded(
child: TextField(
focusNode: _codeNode,
style: TextStyle(
color: MyColours.color_353535,
fontSize: ScreenUtil().setSp(28)),
decoration: InputDecoration(
hintText: "请输入验证码",
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(26)),
border: InputBorder.none,
contentPadding: EdgeInsets.fromLTRB(
0,
ScreenUtil().setWidth(28),
ScreenUtil().setWidth(30),
ScreenUtil().setWidth(28)),
),
onChanged: (value) {
code = value;
},
onEditingComplete: () {
FocusScope.of(context).requestFocus(
FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.number,
),
onChanged: (value) {
code = value;
},
onEditingComplete: () {
FocusScope.of(context).requestFocus(
FocusNode()); //点击空白处隐藏键盘
),
HEmptyView(10),
RoundButton(
height: ScreenUtil().setWidth(84),
text: countdownTime > 0
? "${Utils.durationTransform(countdownTime)}后重新获取"
: "获取验证码",
radius: ScreenUtil().setWidth(10),
textColor: MyColours.color_199095,
gradientStart: MyColours.color_ffffff,
gradientEnd: MyColours.color_ffffff,
borderColor: Colors.transparent,
fontSize: 26,
isBold: false,
onPressed: () async {
if (countdownTime == 0) {
if (phone == null ||
phone.trim().length == 0) {
Utils.showToast('请输入手机号码');
return;
}
if (!Utils.phoneRegExp(phone)) {
Utils.showToast(
'您输入的手机号码格式不正确,请重新输入');
return;
}
model.code = Utils.randomBit(4);
Map<String, String> params = {
"phone": phone,
"code": model.code,
};
startCountdown(model);
bool success = await model
.getPhoneCode(context, params);
if (!success) {
_timer.cancel();
} else {
Utils.showToast('短信验证码已发送,请注意查收');
}
}
},
keyboardType: TextInputType.number,
),
),
HEmptyView(10),
RoundButton(
height: ScreenUtil().setWidth(84),
text: countdownTime > 0
? "${countdownTime}s后重新获取"
: "获取验证码",
radius: ScreenUtil().setWidth(10),
textColor: MyColours.color_199095,
gradientStart: MyColours.color_ffffff,
gradientEnd: MyColours.color_ffffff,
borderColor: Colors.transparent,
fontSize: 26,
isBold: false,
onPressed: () {
if (countdownTime == 0) {
startCountdown();
}
},
),
HEmptyView(20),
],
)),
VEmptyView(120),
RoundButton(
text: '提交',
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
// borderColor: MyColours.color_999999,
radius: ScreenUtil().setWidth(20),
fontSize: 34,
isBold: false,
onPressed: () {
if (phone == null || phone.trim().length == 0) {
Utils.showToast('请输入手机号码');
return;
}
if (code == null || code.trim().length == 0) {
Utils.showToast('请输入验证码');
return;
}
//接口确认验证码是否正确
HEmptyView(20),
],
)),
VEmptyView(120),
RoundButton(
text: '确定',
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
// borderColor: MyColours.color_999999,
radius: ScreenUtil().setWidth(20),
fontSize: 34,
isBold: false,
onPressed: () {
NavigatorUtil.goIfNeedCreateStorePage(context);
if (phone == null || phone.trim().length == 0) {
Utils.showToast('请输入手机号码');
return;
}
if (code == null || code.trim().length == 0) {
Utils.showToast('请输入验证码');
return;
}
if (model.code != null && !codeEnabled) {
Utils.showToast('验证码已失效,请重新获取');
return;
}
if (model.code == null) {
Utils.showToast('请获取验证码');
return;
}
if (model.code != code) {
Utils.showToast('您输入的验证码不正确,请重新输入');
return;
}
// if (countdownTime < 1) {
// Utils.showToast('验证码已失效,请重新获取');
// return;
// }
// 正确
//真正登录成功标志
App.sp.setBool("isLogin", true);
NavigatorUtil.goIfNeedCreateStorePage(context);
//错误
// Utils.showToast('您输入的验证码有误,请重新输入');
},
)
// 正确
//真正登录成功标志
App.sp.setBool("isLogin", true);
NavigatorUtil.goIfNeedCreateStorePage(context);
//错误
// Utils.showToast('您输入的验证码有误,请重新输入');
},
)
// Spacer(),
],
),
// Spacer(),
],
);
}),
),
),
],
... ...
... ... @@ -55,7 +55,7 @@ class _IfNeedCreateStoreState extends State<IfNeedCreateStore> {
onTap: () {
if (noStore) {
//跳转至新建店铺流程
NavigatorUtil.goCreateStorePage(context);
NavigatorUtil.goEnterStoreNamePage(context);
} else {
//进入店铺
... ... @@ -91,7 +91,7 @@ class _IfNeedCreateStoreState extends State<IfNeedCreateStore> {
child: InkWell(
onTap: () {
//跳转至新建店铺流程
NavigatorUtil.goCreateStorePage(context);
NavigatorUtil.goEnterStoreNamePage(context);
},
child: Text(
'不是我,我要重新建店',
... ...
... ... @@ -36,12 +36,16 @@ class ImgPickerWidget extends StatefulWidget {
final Color borderColor;
final ValueChanged onChange;
final int maxImageNumber;
final UploadImageProvider model;
final UploadType uploadType;
ImgPickerWidget(
{Key key,
this.scrollController,
this.borderColor = Colors.blue,
this.onChange,
this.maxImageNumber = 5})
this.maxImageNumber = 5,
this.model,
this.uploadType})
: super(key: key);
@override
... ... @@ -51,7 +55,7 @@ class ImgPickerWidget extends StatefulWidget {
class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
final picker = ImagePicker();
// OnlineCheckEditProvider _onlineCheckEditProvider;
UploadImageProvider _uploadImageProvider;
// UploadImageProvider _uploadImageProvider;
// 用户输入的文件名
String key;
... ... @@ -59,7 +63,7 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
int partSize = 4;
// 用户输入的 token
String token;
/// storage 实例
final Storage storage = Storage();
// 控制器,可以用于取消任务、获取上述的状态,进度等信息
... ... @@ -86,23 +90,36 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
UploadImgModel imgModel = UploadImgModel();
imgModel.file = File(pickedFile.path);
imgModel.process = 0.01;
_uploadImageProvider.imageList.add(imgModel);
if (widget.uploadType == UploadType.ConsumptionUploadType) {
widget.model.imageList.add(imgModel);
} else if (widget.uploadType == UploadType.StoreFrontUploadType) {
widget.model.imageListFront.add(imgModel);
}
} else {
print('No image selected.');
}
});
if (pickedFile != null) {
UploadImageUtil().startUpload(
context,
File(pickedFile.path),
_uploadImageProvider.imageList.length - 1,
true,
_uploadImageProvider);
List<UploadImgModel> temp = [];
if (widget.uploadType == UploadType.ConsumptionUploadType) {
temp = widget.model.imageList;
} else if (widget.uploadType == UploadType.StoreFrontUploadType) {
temp = widget.model.imageListFront;
}
UploadImageUtil().startUpload(context, File(pickedFile.path),
temp.length - 1, true, widget.model, widget.uploadType);
}
}
///多图片选择
void pickAsset(PickType type, {List<AssetPathEntity> pathList}) async {
List<UploadImgModel> temp = [];
if (widget.uploadType == UploadType.ConsumptionUploadType) {
temp = widget.model.imageList;
} else if (widget.uploadType == UploadType.StoreFrontUploadType) {
temp = widget.model.imageListFront;
}
/// context is required, other params is optional.
List<AssetEntity> imgList = await PhotoPicker.pickAsset(
// BuildContext required
... ... @@ -121,8 +138,7 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
// the check box disable color
itemRadio: 0.88,
// the content item radio
maxSelected:
widget.maxImageNumber - _uploadImageProvider.imageList.length,
maxSelected: widget.maxImageNumber - temp.length,
// max picker image count
// provider: I18nProvider.english,
provider: I18nProvider.chinese,
... ... @@ -156,14 +172,11 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
UploadImgModel imgModel = UploadImgModel();
imgModel.file = File(file.absolute.path);
imgModel.process = 0.01;
_uploadImageProvider.imageList.add(imgModel);
temp.add(imgModel);
});
UploadImageUtil().startUpload(
context,
File(file.absolute.path),
_uploadImageProvider.imageList.length - 1,
false,
_uploadImageProvider);
UploadImageUtil().startUpload(context, File(file.absolute.path),
temp.length - 1, false, widget.model, widget.uploadType);
// startUpload(File(file.absolute.path),
// _uploadImageProvider.imageList.length - 1, false);
}
... ... @@ -382,20 +395,23 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
@override
Widget build(BuildContext context) {
_uploadImageProvider =
Provider.of<UploadImageProvider>(context, listen: true);
// _uploadImageProvider =
// Provider.of<UploadImageProvider>(context, listen: true);
List<UploadImgModel> temp = [];
if (widget.uploadType == UploadType.ConsumptionUploadType) {
temp = widget.model.imageList;
} else if (widget.uploadType == UploadType.StoreFrontUploadType) {
temp = widget.model.imageListFront;
}
return _getGridImg(
_uploadImageProvider.imageList.length < widget.maxImageNumber
? _uploadImageProvider.imageList.length + 1
: _uploadImageProvider.imageList.length,
temp.length < widget.maxImageNumber ? temp.length + 1 : temp.length,
context,
_uploadImageProvider.imageList.length == widget.maxImageNumber
? true
: false);
temp.length == widget.maxImageNumber ? true : false,
temp);
}
/// 九宫格
Widget _getGridImg(count, context, isLinjie) {
Widget _getGridImg(count, context, isLinjie, List<UploadImgModel> temp) {
return GridView.builder(
controller: widget.scrollController,
// padding: EdgeInsets.only(top: ScreenUtil().getAdapterSize(10)),
... ... @@ -451,24 +467,20 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
)),
);
}
return _uploadImageProvider.imageList.length < 1
return temp.length < 1
? Text('')
: InkWell(
onTap: () {
if (_uploadImageProvider.imageList[index].process == 1) {
_uploadImageProvider.imageQiniuUrlList = [];
if (_uploadImageProvider.imageList[index].qiniuUrl !=
null) {
for (int i = 0;
i < _uploadImageProvider.imageList.length;
i++) {
_uploadImageProvider.imageQiniuUrlList
.add(_uploadImageProvider.imageList[i].qiniuUrl);
if (temp[index].process == 1) {
widget.model.imageQiniuUrlList = [];
if (temp[index].qiniuUrl != null) {
for (int i = 0; i < temp.length; i++) {
widget.model.imageQiniuUrlList.add(temp[i].qiniuUrl);
}
///没有上传完成的不可以点击
_showPhotoView(context, index,
_uploadImageProvider.imageQiniuUrlList);
_showPhotoView(
context, index, widget.model.imageQiniuUrlList);
}
}
},
... ... @@ -478,15 +490,13 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
alignment: Alignment.topRight,
children: [
Image.file(
_uploadImageProvider.imageList[index].file,
temp[index].file,
fit: BoxFit.cover,
width: ScreenUtil().setWidth(100 * 2),
height: ScreenUtil().setWidth(100 * 2),
),
Offstage(
offstage:
_uploadImageProvider.imageList[index].process <
1,
offstage: temp[index].process < 1,
child: GestureDetector(
child: Image.asset(
Utils.getImgPath("delete"),
... ... @@ -496,16 +506,13 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
onTap: () {
//点击删除按钮
setState(() {
_uploadImageProvider.imageList.removeWhere(
temp.removeWhere(
(element) => element == temp[index]);
widget.model.imageQiniuUrlList.removeWhere(
(element) =>
element ==
_uploadImageProvider
.imageList[index]);
_uploadImageProvider.imageQiniuUrlList
.removeWhere((element) =>
element ==
_uploadImageProvider
.imageQiniuUrlList[index]);
widget
.model.imageQiniuUrlList[index]);
});
},
),
... ... @@ -513,10 +520,8 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
],
),
Offstage(
offstage:
_uploadImageProvider.imageList[index].process == 1,
child: Progress(
_uploadImageProvider.imageList[index].process),
offstage: temp[index].process == 1,
child: Progress(temp[index].process),
)
],
));
... ...
... ... @@ -13,6 +13,7 @@ import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/event_bus.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/utils/upload_image_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/MyDivider.dart';
import 'package:one_key/widgets/common_button.dart';
... ... @@ -605,9 +606,16 @@ class _OnlineCheckEditPageState extends State<OnlineCheckEditPage> {
Padding(
padding: EdgeInsets.all(
ScreenUtil().setWidth(40)),
child: ImgPickerWidget(
child: Consumer<UploadImageProvider>(
builder: (context, model, _) {
return ImgPickerWidget(
model: model,
scrollController:
_scrollController),
_scrollController,
uploadType: UploadType
.ConsumptionUploadType,
);
}),
)
// _getGridImg(1, context)
],
... ...
import 'package:flutter/material.dart';
import 'package:one_key/constant/constant.dart';
import 'package:one_key/models/phone_code_model.dart';
import 'package:one_key/net/base_resp.dart';
import 'package:one_key/net/dio_util.dart';
import 'package:one_key/net/http_url.dart';
import 'package:one_key/utils/utils.dart';
/**
* 第三方登陆
*/
class OtherLoginProvider extends ChangeNotifier {
String phone; //手机号码
String code; //验证码
PhoneCodeSunModel phoneCodeSunModel;
/// 给手机发送短信验证码
Future<bool> getPhoneCode(BuildContext context, Map<String, String> params,
{isShowLoading = true}) async {
BaseResp<Map<String, dynamic>> baseResp = await DioUtil()
.request<Map<String, dynamic>>(
context, Method.get, HttpUrl.send_vc_code,
data: params, showLoading: false)
.catchError((error) {});
if (baseResp.code == Constant.status_success) {
if (baseResp.data.isEmpty) {
return false;
} else {
//解析解析
phoneCodeSunModel = PhoneCodeModel.fromJson(baseResp.responseData).data;
return true;
}
} else {
if (baseResp != null) {
Utils.showToast(baseResp.msg ?? "");
}
return false;
}
}
}
... ...
... ... @@ -7,6 +7,10 @@ import 'package:one_key/net/dio_util.dart';
import 'package:one_key/net/http_url.dart';
import 'package:one_key/utils/utils.dart';
// class UploadImageStore extends UploadImageProvider{
// }
class UploadImageProvider extends ChangeNotifier {
List<UploadImgModel> imageList = []; //图片信息列表
List<String> imageQiniuUrlList = []; //七牛云地址列表
... ... @@ -15,7 +19,8 @@ class UploadImageProvider extends ChangeNotifier {
UploadImgModel erweima = UploadImgModel(); //二维码
double imgSizeTouxiang = 64;
double imgSizeErweima = 22;
List<UploadImgModel> imageListDenvironment = []; //环境信息列表
List<UploadImgModel> imageListFront = []; //门头信息列表
UploadImageProvider() {
touxiang.process = 0.01;
erweima.process = 0.01;
... ...
... ... @@ -12,6 +12,13 @@ import 'package:one_key/pages/coupon/coupon_history_page.dart';
import 'package:one_key/pages/coupon/coupon_page.dart';
import 'package:one_key/pages/coupon/coupon_selecet_page.dart';
import 'package:one_key/pages/create_store/create_store.dart';
import 'package:one_key/pages/create_store/enter_store_address.dart';
import 'package:one_key/pages/create_store/enter_store_environment.dart';
import 'package:one_key/pages/create_store/enter_store_front_photo.dart';
import 'package:one_key/pages/create_store/enter_store_name.dart';
import 'package:one_key/pages/create_store/enter_store_phone.dart';
import 'package:one_key/pages/create_store/enter_store_position.dart';
import 'package:one_key/pages/create_store/enter_store_time.dart';
import 'package:one_key/pages/create_store/map_choice_point.dart';
import 'package:one_key/pages/create_store/play_video.dart';
import 'package:one_key/pages/detail/notebook_detail_change_page.dart';
... ... @@ -39,6 +46,7 @@ import 'package:one_key/provider/choose_table_model.dart';
import 'package:one_key/provider/notebook_detail_change_model.dart';
import 'package:one_key/provider/notebook_detail_model.dart';
import 'package:one_key/provider/order_food_provider.dart';
import 'package:one_key/provider/other_login_provider.dart';
import 'package:one_key/provider/remark_manager_model.dart';
import 'package:one_key/provider/upload_img_provider.dart';
import 'package:one_key/utils/fluro_convert_utils.dart';
... ... @@ -284,7 +292,8 @@ var bindingPhonePageHandler = new Handler(
// CouponSunModel couponSunModel = CouponSunModel.fromJson(json.decode(
// FluroConvertUtils.fluroCnParamsDecode(params["couponSunModel"].first)));
return BindingPhone();
return ChangeNotifierProvider<OtherLoginProvider>(
create: (_) => OtherLoginProvider(), child: BindingPhone());
});
///是否新建店铺页面
... ... @@ -322,3 +331,68 @@ var mapChoicePointPageHandler = new Handler(
// String urlStr = FluroConvertUtils.fluroCnParamsDecode(params["urlStr"].first);
return MapChoicePointPage();
});
///店铺名称
var enterStoreNamePageHandler = new Handler(
handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
// CouponSunModel couponSunModel = CouponSunModel.fromJson(json.decode(
// FluroConvertUtils.fluroCnParamsDecode(params["couponSunModel"].first)));
// String urlStr = FluroConvertUtils.fluroCnParamsDecode(params["urlStr"].first);
return EnterStoreNamePage();
});
///店铺地址
var enterStoreAddressPageHandler = new Handler(
handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
// CouponSunModel couponSunModel = CouponSunModel.fromJson(json.decode(
// FluroConvertUtils.fluroCnParamsDecode(params["couponSunModel"].first)));
// String urlStr = FluroConvertUtils.fluroCnParamsDecode(params["urlStr"].first);
return EnterStoreAddressPage();
});
///店铺担任角色
var enterStorePositionPageHandler = new Handler(
handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
// CouponSunModel couponSunModel = CouponSunModel.fromJson(json.decode(
// FluroConvertUtils.fluroCnParamsDecode(params["couponSunModel"].first)));
// String urlStr = FluroConvertUtils.fluroCnParamsDecode(params["urlStr"].first);
return EnterStorePositionPage();
});
///店铺营业时间
var enterStoreTimePageHandler = new Handler(
handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
// CouponSunModel couponSunModel = CouponSunModel.fromJson(json.decode(
// FluroConvertUtils.fluroCnParamsDecode(params["couponSunModel"].first)));
// String urlStr = FluroConvertUtils.fluroCnParamsDecode(params["urlStr"].first);
return EnterStoreTimePage();
});
///店铺接单电话
var enterStorePhonePageHandler = new Handler(
handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
// CouponSunModel couponSunModel = CouponSunModel.fromJson(json.decode(
// FluroConvertUtils.fluroCnParamsDecode(params["couponSunModel"].first)));
// String urlStr = FluroConvertUtils.fluroCnParamsDecode(params["urlStr"].first);
return EnterStorePhonePage();
});
///店铺门头照片
var enterStoreFrontPhotoPageHandler = new Handler(
handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
// CouponSunModel couponSunModel = CouponSunModel.fromJson(json.decode(
// FluroConvertUtils.fluroCnParamsDecode(params["couponSunModel"].first)));
// String urlStr = FluroConvertUtils.fluroCnParamsDecode(params["urlStr"].first);
return ChangeNotifierProvider<UploadImageProvider>(
create: (_) => UploadImageProvider(), child: EnterStoreFrontPhotoPage());
});
///店铺环境
var enterStoreEnvironmentPageHandler = new Handler(
handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
// CouponSunModel couponSunModel = CouponSunModel.fromJson(json.decode(
// FluroConvertUtils.fluroCnParamsDecode(params["couponSunModel"].first)));
// String urlStr = FluroConvertUtils.fluroCnParamsDecode(params["urlStr"].first);
return ChangeNotifierProvider<UploadImageProvider>(
create: (_) => UploadImageProvider(), child: EnterStoreEnvironmentPage());
});
... ...
... ... @@ -33,6 +33,14 @@ class Routes {
static String create_store = "/create_store"; //新建店铺
static String play_video = "/play_video"; //播放视频页
static String map_choice_point = "/map_choice_point"; //地图位置选择页
static String enter_store_name = "/enter_store_name"; //店铺名称
static String enter_store_address = "/enter_store_address"; //店铺地址
static String enter_store_position = "/enter_store_position"; //店铺担任角色
static String enter_store_time = "/enter_store_time"; //店铺营业时间
static String enter_store_phone = "/enter_store_phone"; //接单电话
static String enter_store_front_photo = "/enter_store_front_photo"; //门头照片
static String enter_store_environment = "/enter_store_environment"; //店铺环境
static void configureRoutes(FluroRouter router) {
... ... @@ -71,11 +79,15 @@ class Routes {
router.define(create_store, handler: createStorePageHandler);
router.define(play_video, handler: playVideoPageHandler);
router.define(map_choice_point, handler: mapChoicePointPageHandler);
router.define(enter_store_name, handler: enterStoreNamePageHandler);
router.define(enter_store_address, handler: enterStoreAddressPageHandler);
router.define(enter_store_position, handler: enterStorePositionPageHandler);
router.define(enter_store_time, handler: enterStoreTimePageHandler);
router.define(enter_store_phone, handler: enterStorePhonePageHandler);
router.define(enter_store_front_photo, handler: enterStoreFrontPhotoPageHandler);
router.define(enter_store_environment, handler: enterStoreEnvironmentPageHandler);
}
}
... ...
... ... @@ -228,4 +228,51 @@ class NavigatorUtil {
{replace = false, String urlStr}) {
return _navigateTo(context, "${Routes.map_choice_point}", replace: replace);
}
/// 店铺名称
static Future<dynamic> goEnterStoreNamePage(BuildContext context,
{replace = false}) {
return _navigateTo(context, "${Routes.enter_store_name}", replace: replace);
}
/// 店铺地址
static Future<dynamic> goEnterStoreAddressPage(BuildContext context,
{replace = false}) {
return _navigateTo(context, "${Routes.enter_store_address}",
replace: replace);
}
/// 店铺担任角色
static Future<dynamic> goEnterStorePositionPage(BuildContext context,
{replace = false}) {
return _navigateTo(context, "${Routes.enter_store_position}",
replace: replace);
}
/// 店铺营业时间
static Future<dynamic> goEnterStoreTimePage(BuildContext context,
{replace = false}) {
return _navigateTo(context, "${Routes.enter_store_time}", replace: replace);
}
/// 店铺接单电话
static Future<dynamic> goEnterStorePhonePage(BuildContext context,
{replace = false}) {
return _navigateTo(context, "${Routes.enter_store_phone}",
replace: replace);
}
/// 店铺门头照片
static Future<dynamic> goEnterStoreFrontPhotoPage(BuildContext context,
{replace = false}) {
return _navigateTo(context, "${Routes.enter_store_front_photo}",
replace: replace);
}
/// 店铺环境
static Future<dynamic> goEnterStoreEnvironmentPage(BuildContext context,
{replace = false}) {
return _navigateTo(context, "${Routes.enter_store_environment}",
replace: replace);
}
}
... ...
... ... @@ -11,6 +11,15 @@ import 'package:photo/photo.dart';
import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart';
import 'package:photo_manager/photo_manager.dart';
enum UploadType {
EnvironmentUploadType, //店铺环境
ConsumptionUploadType, //消费清单
StoreFrontUploadType, //门头
HeadUploadType, //头像
QrcodeUploadType, //二维码
}
class UploadImageUtil {
final picker = ImagePicker();
... ... @@ -28,8 +37,13 @@ class UploadImageUtil {
// 当前的任务状态
///上传到七牛云
void startUpload(BuildContext context, File selectedFile, int index,
bool needInit, UploadImageProvider uploadImageProvider) async {
void startUpload(
BuildContext context,
File selectedFile,
int index,
bool needInit,
UploadImageProvider uploadImageProvider,
UploadType uploadType) async {
final PutController putController = PutController();
print(index);
... ... @@ -40,7 +54,16 @@ class UploadImageUtil {
// 添加整体进度监听
putController.addProgressListener((percent) {
print('${index}任务进度变化:进度:${percent.toStringAsFixed(4)}');
uploadImageProvider.imageList[index].process = percent;
if (uploadType == UploadType.StoreFrontUploadType) {
//门头
uploadImageProvider.imageListFront[index].process = percent;
} else if (uploadType == UploadType.EnvironmentUploadType) {
uploadImageProvider.imageListDenvironment[index].process = percent;
} else if (uploadType == UploadType.ConsumptionUploadType) {
//消费清单
uploadImageProvider.imageList[index].process = percent;
}
uploadImageProvider.notifyListeners();
});
// 添加实际发送进度订阅
... ... @@ -73,8 +96,19 @@ class UploadImageUtil {
String imgUrl = uploadImageProvider.qiniuInfoSunModel.domain +
'/' +
response.rawData['key'];
uploadImageProvider.imageList[index].process = 1;
uploadImageProvider.imageList[index].qiniuUrl = imgUrl;
if (uploadType == UploadType.StoreFrontUploadType) {
//门头
uploadImageProvider.imageListFront[index].process = 1;
uploadImageProvider.imageListFront[index].qiniuUrl = imgUrl;
} else if (uploadType == UploadType.EnvironmentUploadType) {
uploadImageProvider.imageListDenvironment[index].process = 1;
uploadImageProvider.imageListDenvironment[index].qiniuUrl = imgUrl;
} else if (uploadType == UploadType.ConsumptionUploadType) {
//消费清单
uploadImageProvider.imageList[index].process = 1;
uploadImageProvider.imageList[index].qiniuUrl = imgUrl;
}
// 取消当前任务
putController.cancel();
// _image
... ... @@ -117,13 +151,8 @@ class UploadImageUtil {
}
///上传到七牛云
void startUploadOnly(
BuildContext context,
File selectedFile,
int index,
bool needInit,
UploadImageProvider uploadImageProvider,
) async {
void startUploadOnly(BuildContext context, File selectedFile, int index,
bool needInit, UploadImageProvider uploadImageProvider) async {
final PutController putController = PutController();
print(index);
... ...
import 'dart:io';
import 'dart:math';
import 'dart:typed_data';
import 'package:common_utils/common_utils.dart';
... ... @@ -27,6 +28,39 @@ import '../app.dart';
typedef BookTimeSetCallback = void Function(bool needChange);
class Utils {
///手机号码格式验证
static bool phoneRegExp(String phone) {
RegExp exp = RegExp(
r'^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\d{8}$');
return exp.hasMatch(phone);
}
///生成随机验证码
static randomBit(int len) {
String scopeF = '123456789'; //首位
String scopeC = '0123456789'; //中间
String result = '';
for (int i = 0; i < len; i++) {
if (i == 0) {
result = scopeF[Random().nextInt(scopeF.length)];
} else {
result = result + scopeC[Random().nextInt(scopeC.length)];
}
}
return result;
}
//时间转换 将秒转换为小时分钟
static String durationTransform(int seconds) {
Duration d = Duration(seconds: seconds);
List<String> parts = d.toString().split(':');
return '${parts[1]}:${parts[2].substring(0, 2)}';
// int minute = seconds % 3600 ~/ 60;
// // 如果用到秒的话计算
// int second = seconds % 60;
// return '${minute}:${second}';
}
static getDeviceInfoSystem() async {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
if (Platform.isIOS) {
... ...