Commit 3539d36125c733a9d9af9222d8cecca5d3fffff0

Authored by wdn127929
1 parent f21a014d

UI修改

1.35 KB | W: | H:

5.02 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin

5.76 KB | W: | H:

6.2 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
... ... @@ -17,8 +17,12 @@ PODS:
- flutter_bugly (0.0.1):
- Bugly
- Flutter
- flutter_ijkplayer (0.0.1):
- Flutter
- FlutterIJK (~> 0.1.0)
- flutter_statusbarcolor (0.0.1):
- Flutter
- FlutterIJK (0.1.1)
- fluttertoast (0.0.2):
- Flutter
- fluwx (0.0.1):
... ... @@ -53,6 +57,10 @@ PODS:
- TPNS-iOS (= 1.2.7.2)
- url_launcher (0.0.1):
- Flutter
- video_player (0.0.1):
- Flutter
- wakelock (0.0.1):
- Flutter
- webview_flutter (0.0.1):
- Flutter
- WechatOpenSDK (1.8.7.1)
... ... @@ -66,6 +74,7 @@ DEPENDENCIES:
- Flutter (from `Flutter`)
- flutter_app_badger (from `.symlinks/plugins/flutter_app_badger/ios`)
- flutter_bugly (from `.symlinks/plugins/flutter_bugly/ios`)
- flutter_ijkplayer (from `.symlinks/plugins/flutter_ijkplayer/ios`)
- flutter_statusbarcolor (from `.symlinks/plugins/flutter_statusbarcolor/ios`)
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
- fluwx (from `.symlinks/plugins/fluwx/ios`)
... ... @@ -80,11 +89,14 @@ DEPENDENCIES:
- sqflite (from `.symlinks/plugins/sqflite/ios`)
- tpns_flutter_plugin (from `.symlinks/plugins/tpns_flutter_plugin/ios`)
- url_launcher (from `.symlinks/plugins/url_launcher/ios`)
- video_player (from `.symlinks/plugins/video_player/ios`)
- wakelock (from `.symlinks/plugins/wakelock/ios`)
- webview_flutter (from `.symlinks/plugins/webview_flutter/ios`)
SPEC REPOS:
trunk:
- Bugly
- FlutterIJK
- FMDB
- Reachability
- TPNS-iOS
... ... @@ -107,6 +119,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_app_badger/ios"
flutter_bugly:
:path: ".symlinks/plugins/flutter_bugly/ios"
flutter_ijkplayer:
:path: ".symlinks/plugins/flutter_ijkplayer/ios"
flutter_statusbarcolor:
:path: ".symlinks/plugins/flutter_statusbarcolor/ios"
fluttertoast:
... ... @@ -135,6 +149,10 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/tpns_flutter_plugin/ios"
url_launcher:
:path: ".symlinks/plugins/url_launcher/ios"
video_player:
:path: ".symlinks/plugins/video_player/ios"
wakelock:
:path: ".symlinks/plugins/wakelock/ios"
webview_flutter:
:path: ".symlinks/plugins/webview_flutter/ios"
... ... @@ -148,7 +166,9 @@ SPEC CHECKSUMS:
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
flutter_app_badger: 65de4d6f0c34a891df49e6cfb8a1c0496426fa68
flutter_bugly: c9800f4d5bc5bdc27ffdde3417a26ba44266e0c3
flutter_ijkplayer: ef9006131553deb6d8ae6d7fbd3bcbf93b135930
flutter_statusbarcolor: 8afb1071ed8c58be929f1e32b36c629771fd2259
FlutterIJK: f3c0ead9ca31b93d993d46dda53156fdc7b22d2c
fluttertoast: b644586ef3b16f67fae9a1f8754cef6b2d6b634b
fluwx: 07a55ed66bf3a4961e836a2a411b02dcada32902
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
... ... @@ -165,6 +185,8 @@ SPEC CHECKSUMS:
TPNS-iOS: 9b35473a4a0d07f2c2730ea1e66c6749c2b98095
tpns_flutter_plugin: 8dbbee157aab91a878f64d056c1383726a6c5c4d
url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
video_player: 9cc823b1d9da7e8427ee591e8438bfbcde500e6e
wakelock: 0d4a70faf8950410735e3f61fb15d517c8a6efc4
webview_flutter: d2b4d6c66968ad042ad94cbb791f5b72b4678a96
WechatOpenSDK: 6a4d1436c15b3b5fe2a0bd383f3046010186da44
... ...
... ... @@ -298,6 +298,8 @@
"${BUILT_PRODUCTS_DIR}/sign_in_with_apple/sign_in_with_apple.framework",
"${BUILT_PRODUCTS_DIR}/sqflite/sqflite.framework",
"${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework",
"${BUILT_PRODUCTS_DIR}/video_player/video_player.framework",
"${BUILT_PRODUCTS_DIR}/wakelock/wakelock.framework",
"${BUILT_PRODUCTS_DIR}/webview_flutter/webview_flutter.framework",
);
name = "[CP] Embed Pods Frameworks";
... ... @@ -322,6 +324,8 @@
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sign_in_with_apple.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/sqflite.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_player.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/wakelock.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/webview_flutter.framework",
);
runOnlyForDeploymentPostprocessing = 0;
... ...
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/pages/create_store/video_widget.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/widgets/round_button.dart';
... ... @@ -44,6 +45,66 @@ class _CreateStorePageState extends State<CreateStorePage> {
return list;
}
///店铺名称
Widget _storeNameWidget() {
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.number,
)
],
);
}
///店铺环境
Widget _storeEnvironmentWidget() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('3.请上传您店铺环境的照片或者视频',
style: TextStyle(
fontSize: ScreenUtil().setSp(30), fontWeight: FontWeight.bold)),
VEmptyView(30),
VideoPickerWidget(maxImageNumber: 1)
],
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
... ... @@ -74,6 +135,10 @@ class _CreateStorePageState extends State<CreateStorePage> {
fontWeight: FontWeight.bold)),
VEmptyView(30),
Column(children: _roomTypeWidget()),
_storeNameWidget(),
VEmptyView(30),
_storeEnvironmentWidget(),
VEmptyView(30),
]))),
RoundButton(
text: '下一步',
... ...
import 'package:flutter/material.dart';
import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/widgets/system_app_bar.dart';
class PlayVideoPage extends StatefulWidget {
final String url;
PlayVideoPage({Key key, this.url}) : super(key: key);
@override
_PlayVideoPageState createState() => _PlayVideoPageState();
}
class _PlayVideoPageState extends State<PlayVideoPage> {
IjkMediaController ijkMediaController = IjkMediaController();
@override
void initState() {
// TODO: implement initState
super.initState();
ijkMediaController.setNetworkDataSource(
widget.url,
autoPlay: true,
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: SystemAppBar(
'cannnn',
onTap: () {
Navigator.pop(context);
},
),
body: IjkPlayer(mediaController: ijkMediaController),
);
}
}
... ...
import 'dart:convert';
import 'dart:io';
import 'dart:async';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/models/upload_img_model.dart';
import 'package:one_key/pages/online_check/photo_view_wiget.dart';
import 'package:one_key/pages/online_check/progress.dart';
import 'package:one_key/provider/online_check_edit_provider.dart';
import 'package:one_key/provider/upload_img_provider.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/misc.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/v_empty_view.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:photo/photo.dart';
import 'package:provider/provider.dart';
import 'package:image_picker/image_picker.dart';
import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart';
import 'package:video_player/video_player.dart';
import '../online_check/dispose.dart';
import 'package:photo_manager/photo_manager.dart';
// import 'package:video_thumbnail/video_thumbnail.dart';
import 'package:chewie/chewie.dart';
typedef void OnPickImageCallback(
double maxWidth, double maxHeight, int quality);
class VideoPickerWidget extends StatefulWidget {
final ScrollController scrollController;
final Color borderColor;
final ValueChanged onChange;
final int maxImageNumber;
VideoPickerWidget(
{Key key,
this.scrollController,
this.borderColor = Colors.blue,
this.onChange,
this.maxImageNumber = 5})
: super(key: key);
@override
_VideoPickerWidgetState createState() => _VideoPickerWidgetState();
}
class _VideoPickerWidgetState extends DisposableState<VideoPickerWidget> {
final picker = ImagePicker();
// OnlineCheckEditProvider _onlineCheckEditProvider;
UploadImageProvider _uploadImageProvider;
// 用户输入的文件名
String key;
// 用户输入的 partSize
int partSize = 4;
// 用户输入的 token
String token;
/// storage 实例
final Storage storage = Storage();
// 控制器,可以用于取消任务、获取上述的状态,进度等信息
// PutController putController = PutController();
// 当前的任务状态
// String thumbnailPath;
VideoPlayerController _controller;
Future _initializeVideoPlayerFuture;
// 声明控制器(两个)
VideoPlayerController videoPlayerController;
ChewieController chewieController;
IjkMediaController ijkMediaController = IjkMediaController();
@override
void initState() {
// storage = Storage();
// putController = PutController();
super.initState();
// _controller.setLooping(false);
// 生成控制器(两个)
}
@override
void dispose() {
super.dispose();
// 销毁播放器的控制器
_controller.dispose();
chewieController.dispose();
}
///#相机拍照,单图选择
Future _getFromPictureOrCamera(imageSource) async {
final pickedFile = await picker.getVideo(
source: imageSource, maxDuration: const Duration(seconds: 15));
// thumbnailPath = await VideoThumbnail.thumbnailFile(
// video: pickedFile.path,
// imageFormat: ImageFormat.PNG,
// maxWidth: 128,
// quality: 25);
// print(thumbnailPath);
_controller = VideoPlayerController.file(File(pickedFile.path));
_initializeVideoPlayerFuture = _controller.initialize();
setState(() {
if (pickedFile != null) {
UploadImgModel imgModel = UploadImgModel();
imgModel.file = File(pickedFile.path);
imgModel.process = 0.01;
_uploadImageProvider.imageList.add(imgModel);
} else {
print('No image selected.');
}
});
if (pickedFile != null) {
UploadImageUtil().startUpload(
context,
File(pickedFile.path),
_uploadImageProvider.imageList.length - 1,
true,
_uploadImageProvider);
}
}
///多图片选择
void pickAsset(PickType type, {List<AssetPathEntity> pathList}) async {
/// context is required, other params is optional.
List<AssetEntity> imgList = await PhotoPicker.pickAsset(
// BuildContext required
context: context,
/// The following are optional parameters.
themeColor: MyColours.color_199095,
// the title color and bottom color
textColor: Colors.white,
// text color
padding: 1.0,
// item padding
dividerColor: Colors.grey,
// divider color
disableColor: Colors.grey.shade300,
// the check box disable color
itemRadio: 0.88,
// the content item radio
maxSelected:
widget.maxImageNumber - _uploadImageProvider.imageList.length,
// max picker image count
// provider: I18nProvider.english,
provider: I18nProvider.chinese,
// i18n provider ,default is chinese. , you can custom I18nProvider or use ENProvider()
rowCount: 3,
// item row count
thumbSize: 150,
// preview thumb size , default is 64
sortDelegate: SortDelegate.common,
// default is common ,or you make custom delegate to sort your gallery
checkBoxBuilderDelegate: DefaultCheckBoxBuilderDelegate(
activeColor: MyColours.color_353535,
unselectedColor: Colors.white,
checkColor: MyColours.color_199095,
),
// default is DefaultCheckBoxBuilderDelegate ,or you make custom delegate to create checkbox
// loadingDelegate: this,
// if you want to build custom loading widget,extends LoadingDelegate, [see example/lib/main.dart]
badgeDelegate: const DurationBadgeDelegate(),
// badgeDelegate to show badge widget
pickType: type,
photoPathList: pathList,
);
if (imgList == null || imgList.isEmpty) {
print("No pick item.");
return;
} else {
for (int i = 0; i < imgList.length; i++) {
var file = await imgList[i].file;
setState(() {
UploadImgModel imgModel = UploadImgModel();
imgModel.file = File(file.absolute.path);
imgModel.process = 0.01;
_uploadImageProvider.imageList.add(imgModel);
});
UploadImageUtil().startUpload(
context,
File(file.absolute.path),
_uploadImageProvider.imageList.length - 1,
false,
_uploadImageProvider);
// startUpload(File(file.absolute.path),
// _uploadImageProvider.imageList.length - 1, false);
}
}
}
///添加图片UI弹出
Future _openModalBottomSheet(context) async {
final option = await showModalBottomSheet(
context: context,
backgroundColor: Colors.transparent,
isDismissible: false,
builder: (BuildContext context) {
return Container(
// height: ScreenUtil().setWidth(180 * 2),
decoration: BoxDecoration(
color: MyColours.color_ffffff,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(ScreenUtil().setWidth(24)),
topRight: Radius.circular(ScreenUtil().setWidth(24)))),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
InkWell(
onTap: () {
Utils.getPickPermission(context, () {
_getFromPictureOrCamera(ImageSource.camera);
Navigator.pop(context);
}, PermissionGroup.camera);
},
child: Container(
width: double.infinity,
height: ScreenUtil().setWidth(58 * 2),
child: Center(
child: Text(
'拍摄',
style: TextStyle(
fontSize: ScreenUtil().setSp(32),
color: MyColours.color_353535,
fontWeight: FontWeight.bold),
),
)),
),
MyDivider(
double.infinity,
ScreenUtil().setWidth(2),
color: MyColours.color_EEEEEE,
),
InkWell(
onTap: () {
Utils.getPickPermission(context, () {
// pickAsset(PickType.onlyVideo);
_getFromPictureOrCamera(ImageSource.gallery);
Navigator.pop(context);
}, PermissionGroup.photos);
},
child: Container(
width: double.infinity,
height: ScreenUtil().setWidth(58 * 2),
child: Center(
child: Text(
'从相册选择',
style: TextStyle(
fontSize: ScreenUtil().setSp(32),
color: MyColours.color_353535,
fontWeight: FontWeight.bold),
),
)),
),
MyDivider(
double.infinity,
ScreenUtil().setWidth(10),
color: MyColours.color_EEEEEE,
),
InkWell(
onTap: () {
Navigator.pop(context, '取消');
},
child: Container(
width: double.infinity,
height: ScreenUtil().setWidth(58 * 2),
child: Center(
child: Text(
'取消',
style: TextStyle(
fontSize: ScreenUtil().setSp(32),
color: MyColours.color_353535,
fontWeight: FontWeight.bold),
),
)))
],
),
);
});
}
//查看大图
_showPhotoView(BuildContext context, int index, List imgs,
{isShow = false, List dashName}) async {
// if (imgs.length == 1 &&
// imgs[0] ==
// 'http://nosqn.colorcun.com/custom/lite-online/image/def-banner.png') {
// imgs[0] = 'http://nosqn.colorcun.com/app/seller-hj-empty.png';
// }
// _controller = VideoPlayerController.network(imgs[index]);
// chewieController = ChewieController(
// videoPlayerController: _controller,
// // 比例
// // aspectRatio: 16 / 9,
// // 自动播放
// autoPlay: true,
// // 循环
// looping: true,
// );
ijkMediaController.setNetworkDataSource(
imgs[index],
autoPlay: true,
);
Utils.setBarStatus(false, color: Colors.black);
dynamic result = await showGeneralDialog(
context: context,
barrierDismissible: false,
barrierColor: Colors.black,
barrierLabel:
MaterialLocalizations.of(context).modalBarrierDismissLabel,
transitionDuration: const Duration(milliseconds: 150),
pageBuilder: (BuildContext context, Animation animation,
Animation secondaryAnimation) {
return Column(
children: [
Container(
height: ScreenUtil().setWidth(100),
color: Colors.black,
child: Row(
children: [
Material(
child: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Image.asset(Utils.getImgPath('invication_back')),
)),
],
),
),
// Chewie(
// controller: chewieController,
// ),
IjkPlayer(mediaController: ijkMediaController),
],
);
});
// Utils.setBarStatus(true, color: Colors.white);
}
@override
Widget build(BuildContext context) {
_uploadImageProvider =
Provider.of<UploadImageProvider>(context, listen: true);
return _getGridImg(
_uploadImageProvider.imageList.length < widget.maxImageNumber
? _uploadImageProvider.imageList.length + 1
: _uploadImageProvider.imageList.length,
context,
_uploadImageProvider.imageList.length == widget.maxImageNumber
? true
: false);
}
/// 九宫格
Widget _getGridImg(count, context, isLinjie) {
// return
// GridView.builder(
// controller: widget.scrollController,
// // padding: EdgeInsets.only(top: ScreenUtil().getAdapterSize(10)),
// shrinkWrap: true,
// itemCount: count,
// //SliverGridDelegateWithFixedCrossAxisCount 构建一个横轴固定数量Widget
// gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
// //横轴元素个数
// crossAxisCount: 1,
// //纵轴间距
// mainAxisSpacing: ScreenUtil().setWidth(30),
// //横轴间距
// crossAxisSpacing: ScreenUtil().setWidth(30),
// //子组件宽高长度比例
// // childAspectRatio: 1.0
// ),
// itemBuilder: (BuildContext context, int index) {
//Widget Function(BuildContext context, int index)
var linjie = widget.maxImageNumber;
if (isLinjie) {
linjie = widget.maxImageNumber - 1;
}
if (0 == count - 1 && 0 < linjie) {
return InkWell(
onTap: () {
// 触摸收起键盘
FocusScope.of(context).requestFocus(FocusNode());
_openModalBottomSheet(context);
},
child: Container(
width: ScreenUtil().setWidth(90 * 2),
height: ScreenUtil().setWidth(90 * 2),
decoration: BoxDecoration(
border: Border.all(
color: MyColours.color_E0E0E0,
width: ScreenUtil().setWidth(2)),
),
child: Column(
children: [
VEmptyView(74),
Image.asset(
Utils.getImgPath('add_image'),
width: ScreenUtil().setWidth(32),
height: ScreenUtil().setWidth(32),
),
VEmptyView(10),
Text(
'添加视频',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_999999),
)
],
)),
);
}
return _uploadImageProvider.imageList.length < 1
? Text('')
: InkWell(
onTap: () {
if (_uploadImageProvider.imageList[0].process == 1) {
_uploadImageProvider.imageQiniuUrlList = [];
if (_uploadImageProvider.imageList[0].qiniuUrl != null) {
for (int i = 0;
i < _uploadImageProvider.imageList.length;
i++) {
_uploadImageProvider.imageQiniuUrlList
.add(_uploadImageProvider.imageList[i].qiniuUrl);
}
///没有上传完成的不可以点击
// _showPhotoView(
// context, 0, _uploadImageProvider.imageQiniuUrlList);
NavigatorUtil.goPlayVideoPage(context,
urlStr: _uploadImageProvider.imageQiniuUrlList[0]);
}
}
},
child: Stack(
children: [
Stack(
alignment: Alignment.topRight,
children: [
// Image.file(
// // _uploadImageProvider.imageList[index].file,
// File(thumbnailPath),
// fit: BoxFit.cover,
// width: ScreenUtil().setWidth(100 * 2),
// height: ScreenUtil().setWidth(100 * 2),
// ),
FutureBuilder(
//显示缩略图
future: _initializeVideoPlayerFuture,
builder: (context, snapshot) {
print(snapshot.connectionState);
if (snapshot.hasError) print(snapshot.error);
if (snapshot.connectionState == ConnectionState.done) {
return Container(
width: ScreenUtil().setWidth(225),
child: AspectRatio(
// aspectRatio: 1 / 1,
aspectRatio: _controller.value.aspectRatio,
child: VideoPlayer(_controller),
),
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
},
),
Offstage(
offstage: _uploadImageProvider.imageList[0].process < 1,
child: GestureDetector(
child: Image.asset(
Utils.getImgPath("delete"),
width: ScreenUtil().setWidth(40),
height: ScreenUtil().setWidth(40),
),
onTap: () {
//点击删除按钮
setState(() {
_uploadImageProvider.imageList.removeWhere(
(element) =>
element ==
_uploadImageProvider.imageList[0]);
_uploadImageProvider.imageQiniuUrlList.removeWhere(
(element) =>
element ==
_uploadImageProvider.imageQiniuUrlList[0]);
});
},
),
),
],
),
Offstage(
offstage: _uploadImageProvider.imageList[0].process == 1,
child: Progress(_uploadImageProvider.imageList[0].process),
)
],
));
// });
}
}
... ...
... ... @@ -59,8 +59,10 @@ class _BindingPhoneState extends State<BindingPhone> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: SystemAppBar(
'绑定手机号',
'',
leftTitle: '上一步',
onTap: () {
Navigator.pop(context);
},
... ... @@ -70,132 +72,171 @@ class _BindingPhoneState extends State<BindingPhone> {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
},
child: Container(
padding: EdgeInsets.all(ScreenUtil().setWidth(40)),
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(35 * 2),
vertical: ScreenUtil().setWidth(30 * 2)),
child: Column(
children: [
Expanded(
child: SingleChildScrollView(
controller: _controller,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
// textAlignVertical: TextAlignVertical.bottom,
maxLines: 1,
// //光标颜色
// cursorColor:
// widget.isSelect ? Colors.white : MyColours.color_199095,
//输入文本的样式
style: TextStyle(
fontSize: ScreenUtil().setSp(28),
),
focusNode: _phoneNode,
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.number,
),
VEmptyView(30),
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,
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: (_) {},
onEditingComplete: () {
FocusScope.of(context).requestFocus(
FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.number,
),
)
],
)),
VEmptyView(10),
Container(
// height: ScreenUtil().setWidth(20),
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(
children: [
Expanded(
child: TextField(
// textAlignVertical: TextAlignVertical.bottom,
maxLines: 1,
// //光标颜色
// cursorColor:
// widget.isSelect ? Colors.white : MyColours.color_199095,
//输入文本的样式
style: TextStyle(
fontSize: ScreenUtil().setSp(28),
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
HEmptyView(30),
Text(
"验证码",
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(26)),
),
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),
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: (_) {},
onEditingComplete: () {
FocusScope.of(context).requestFocus(
FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.number,
),
// enabledBorder: new UnderlineInputBorder(
// borderSide: BorderSide.none,
// ),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: MyColours.color_199095)),
),
onChanged: (value) {},
onEditingComplete: () {
FocusScope.of(context)
.requestFocus(FocusNode()); //点击空白处隐藏键盘
},
keyboardType: TextInputType.number,
),
),
HEmptyView(20),
RoundButton(
height: ScreenUtil().setWidth(88),
width: ScreenUtil().setWidth(240),
text: countdownTime > 0
? "${countdownTime}s后重新获取"
: "获取验证码",
radius: ScreenUtil().setWidth(10),
textColor: MyColours.color_333333,
gradientStart: MyColours.color_ffffff,
gradientEnd: MyColours.color_ffffff,
borderColor: MyColours.color_999999,
fontSize: 28,
isBold: false,
onPressed: () {
if (countdownTime == 0) {
startCountdown();
}
},
)
],
)),
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: () {
//真正登录成功标志
App.sp.setBool("isLogin", true);
NavigatorUtil.goIfNeedCreateStorePage(context);
},
)
// Spacer(),
],
),
),
),
RoundButton(
text: '提交',
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
// borderColor: MyColours.color_999999,
radius: ScreenUtil().setWidth(20),
fontSize: 28,
isBold: false,
onPressed: () {
//真正登录成功标志
App.sp.setBool("isLogin", true);
NavigatorUtil.goIfNeedCreateStorePage(context);
},
)
],
))),
);
... ...
... ... @@ -2,6 +2,7 @@ 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';
... ... @@ -15,12 +16,14 @@ class IfNeedCreateStore extends StatefulWidget {
class _IfNeedCreateStoreState extends State<IfNeedCreateStore> {
ScrollController _controller = ScrollController();
bool noStore = true;
bool noStore = false;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: SystemAppBar(
'xxx',
'',
leftTitle: '上一步',
onTap: () {
Navigator.pop(context);
},
... ... @@ -28,17 +31,26 @@ class _IfNeedCreateStoreState extends State<IfNeedCreateStore> {
body: Container(
width: double.infinity,
padding: EdgeInsets.all(ScreenUtil().setWidth(40)),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
child: Column(crossAxisAlignment: CrossAxisAlignment.center,
// mainAxisAlignment: MainAxisAlignment.center,
children: [
VEmptyView(80),
Image.asset(
noStore
? Utils.getImgPath('not_member')
: Utils.getImgPath('is_member'),
width: ScreenUtil().setWidth(120),
height: ScreenUtil().setWidth(120),
),
VEmptyView(60),
Text(
noStore ? '您还没有绑定任何店铺' : '您已经是“xxxxx”的员工',
style: TextStyle(
fontSize: ScreenUtil().setSp(30),
fontSize: ScreenUtil().setSp(32),
color: MyColours.color_333333,
fontWeight: FontWeight.bold),
),
VEmptyView(30),
VEmptyView(172),
InkWell(
onTap: () {
if (noStore) {
... ... @@ -50,31 +62,32 @@ class _IfNeedCreateStoreState extends State<IfNeedCreateStore> {
}
},
child: Container(
width: double.infinity,
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(30),
vertical: ScreenUtil().setWidth(16)),
horizontal: ScreenUtil().setWidth(40),
vertical: ScreenUtil().setWidth(18)),
decoration: BoxDecoration(
color: MyColours.color_199095,
color: MyColours.color_24A4A8,
borderRadius: BorderRadius.circular(
ScreenUtil().setWidth(10))),
constraints: BoxConstraints(
minWidth: ScreenUtil().setWidth(260)),
child: Text(
noStore ? '创建店铺' : '进入xxxxx',
noStore ? '创建店铺' : '进入“xxxxxxx”',
textAlign: TextAlign.center,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: MyColours.color_ffffff,
fontSize: ScreenUtil().setSp(28)),
fontSize: ScreenUtil().setSp(34)),
),
)),
noStore
? Container()
: Container(
margin:
EdgeInsets.only(top: ScreenUtil().setWidth(10)),
EdgeInsets.only(top: ScreenUtil().setWidth(40)),
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(30),
vertical: ScreenUtil().setWidth(16)),
horizontal: ScreenUtil().setWidth(30),
),
child: InkWell(
onTap: () {
//跳转至新建店铺流程
... ... @@ -84,8 +97,8 @@ class _IfNeedCreateStoreState extends State<IfNeedCreateStore> {
'不是我,我要重新建店',
textAlign: TextAlign.center,
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(24)),
color: MyColours.color_199095,
fontSize: ScreenUtil().setSp(30)),
),
)),
])));
... ...
... ... @@ -14,6 +14,7 @@ import 'package:one_key/provider/user_model.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/MyDivider.dart';
import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/v_empty_view.dart';
... ... @@ -314,13 +315,14 @@ class LoginState extends State<LoginPage> with WidgetsBindingObserver {
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
VEmptyView(218 - App.statusBarHeight),
// VEmptyView(218 - App.statusBarHeight),
VEmptyView(80 + App.statusBarHeight),
Image.asset(
"assets/logo.png",
width: ScreenUtil().setWidth(217),
height: ScreenUtil().setWidth(206),
width: ScreenUtil().setWidth(74 * 2),
height: ScreenUtil().setWidth(71 * 2),
),
VEmptyView(121),
VEmptyView(80),
Container(
height: ScreenUtil().setHeight(84),
width: ScreenUtil().setWidth(611),
... ... @@ -503,11 +505,13 @@ class LoginState extends State<LoginPage> with WidgetsBindingObserver {
alignment: Alignment.centerLeft,
child: Text(
errorText,
// 'hfhfhf',
style: TextStyle(
color: MyColours.color_d93535,
fontSize: ScreenUtil().setSp(16)),
),
),
VEmptyView(40),
Consumer<UserModel>(
builder:
(BuildContext context, UserModel value, Widget child) {
... ... @@ -532,10 +536,8 @@ class LoginState extends State<LoginPage> with WidgetsBindingObserver {
});
},
child: Container(
height: ScreenUtil().setHeight(80),
height: ScreenUtil().setWidth(84),
width: ScreenUtil().setWidth(611),
margin:
EdgeInsets.only(top: ScreenUtil().setHeight(56)),
alignment: Alignment.center,
decoration: BoxDecoration(
color: isActivate
... ... @@ -559,43 +561,7 @@ class LoginState extends State<LoginPage> with WidgetsBindingObserver {
);
},
),
VEmptyView(140),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Offstage(
offstage: !App.isInstallWx,
child: InkWell(
child: Image.asset(
Utils.getImgPath('icon_wechat_login'),
width: ScreenUtil().setWidth(56)),
onTap: () {
if (!_check) {
Utils.showToast('请仔细阅读协议');
return;
}
_wxLogin();
},
)),
Platform.isAndroid
? Text('')
: InkWell(
child: Container(
margin: EdgeInsets.only(
left: Platform.isAndroid
? ScreenUtil().setWidth(0)
: ScreenUtil().setWidth(50)),
child: Image.asset(Utils.getImgPath('apple'),
width: ScreenUtil().setWidth(46))),
onTap: () {
if (!_check) {
Utils.showToast('请仔细阅读协议');
return;
}
_iosLogin();
}),
],
),
VEmptyView(20),
Row(
// mainAxisSize: MainAxisSize.min,
... ... @@ -655,6 +621,63 @@ class LoginState extends State<LoginPage> with WidgetsBindingObserver {
)
],
),
VEmptyView(120),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
MyDivider(
ScreenUtil().setWidth(68 * 2), ScreenUtil().setWidth(2),
color: MyColours.color_e5e5e5),
HEmptyView(20),
Text(
'其他登录方式',
style: TextStyle(
fontSize: ScreenUtil().setWidth(24),
color: MyColours.color_999999),
),
HEmptyView(20),
MyDivider(
ScreenUtil().setWidth(68 * 2), ScreenUtil().setWidth(2),
color: MyColours.color_e5e5e5),
],
),
VEmptyView(80),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Platform.isAndroid
? Text('')
: InkWell(
child: Image.asset(Utils.getImgPath('apple'),
width: ScreenUtil().setWidth(100)),
onTap: () {
if (!_check) {
Utils.showToast('请仔细阅读协议');
return;
}
_iosLogin();
}),
Offstage(
offstage: !App.isInstallWx,
child: InkWell(
child: Container(
margin: EdgeInsets.only(
left: Platform.isAndroid
? ScreenUtil().setWidth(0)
: ScreenUtil().setWidth(140)),
child: Image.asset(
Utils.getImgPath('icon_wechat_login'),
width: ScreenUtil().setWidth(100))),
onTap: () {
if (!_check) {
Utils.showToast('请仔细阅读协议');
return;
}
_wxLogin();
},
)),
],
),
],
),
),
... ...
... ... @@ -12,6 +12,7 @@ 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/play_video.dart';
import 'package:one_key/pages/detail/notebook_detail_change_page.dart';
import 'package:one_key/pages/home/home_page.dart';
import 'package:one_key/pages/invicate/invitation_page.dart';
... ... @@ -299,3 +300,12 @@ var createStorePageHandler = new Handler(
return CreateStorePage();
});
///播放视频页
var playVideoPageHandler = 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 PlayVideoPage(url: urlStr);
});
... ...
... ... @@ -31,6 +31,8 @@ class Routes {
static String binding_phone = "/binding_phone"; //绑定手机号码页面
static String if_need_create_store = "/if_need_create_store"; //是否选择新建店铺页面
static String create_store = "/create_store"; //新建店铺
static String play_video = "/play_video"; //播放视频页
static void configureRoutes(FluroRouter router) {
router.notFoundHandler = new Handler(
... ... @@ -66,6 +68,7 @@ class Routes {
router.define(binding_phone, handler: bindingPhonePageHandler);
router.define(if_need_create_store, handler: ifNeedCreateStorePageHandler);
router.define(create_store, handler: createStorePageHandler);
router.define(play_video, handler: playVideoPageHandler);
... ...
... ... @@ -8,6 +8,7 @@ import 'package:one_key/res/colors.dart';
import 'package:one_key/route/routes.dart';
import 'package:one_key/utils/fluro_convert_utils.dart';
import 'package:one_key/utils/utils.dart';
import 'package:sqflite/sqlite_api.dart';
import '../app.dart';
... ... @@ -15,6 +16,7 @@ class NavigatorUtil {
static Future _navigateTo(BuildContext context, String path,
{bool replace = false,
bool clearStack = false,
TransitionType transitionType = TransitionType.material,
Duration transitionDuration = const Duration(milliseconds: 250),
RouteTransitionsBuilder transitionBuilder}) {
Utils.changeStatusColor(color: MyColours.color_ffffff);
... ... @@ -23,7 +25,7 @@ class NavigatorUtil {
clearStack: clearStack,
transitionDuration: transitionDuration,
transitionBuilder: transitionBuilder,
transition: TransitionType.material);
transition: transitionType);
}
/// 登录页
... ... @@ -211,4 +213,23 @@ class NavigatorUtil {
{replace = false}) {
return _navigateTo(context, "${Routes.create_store}", replace: replace);
}
/// 播放视频页
static Future<dynamic> goPlayVideoPage(BuildContext context,
{replace = false, String urlStr}) {
return _navigateTo(
context,
"${Routes.play_video}?urlStr=${FluroConvertUtils.fluroCnParamsEncode(urlStr)}",
replace: replace,
transitionBuilder: (BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation, Widget child) {
return FadeTransition(
opacity: CurvedAnimation(
parent: animation,
curve: Curves.linear,
),
child: child);
},
);
}
}
... ...
... ... @@ -10,19 +10,23 @@ class SystemAppBar extends StatelessWidget implements PreferredSizeWidget {
final GestureTapCallback onTap;
final bool showLeading;
final GestureTapCallback onTapRight;
final String leftTitle;
const SystemAppBar(this.title,
{Key key,
this.rightImgName,
this.onTap,
this.onTapRight,
this.showLeading = true})
this.showLeading = true,
this.leftTitle = ''})
: super(key: key);
@override
Widget build(BuildContext context) {
return AppBar(
elevation: 0,
leadingWidth:
leftTitle != '' ? ScreenUtil().setWidth(84 * 2 + 40 + 10) : 56,
leading: showLeading
? InkWell(
onTap: onTap,
... ... @@ -36,7 +40,17 @@ class SystemAppBar extends StatelessWidget implements PreferredSizeWidget {
"assets/icon_back.png",
width: ScreenUtil().setWidth(20),
height: ScreenUtil().setWidth(31),
)
),
leftTitle != ''
? Padding(
padding: EdgeInsets.only(
left: ScreenUtil().setWidth(20)),
child: Text(leftTitle,
style: TextStyle(
fontSize: ScreenUtil().setWidth(30),
color: MyColours.color_333333)),
)
: Container()
],
)),
)
... ...
... ... @@ -127,6 +127,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.4"
chewie:
dependency: "direct main"
description:
name: chewie
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.10.1"
clock:
dependency: transitive
description:
... ... @@ -335,6 +342,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.8"
flutter_ijkplayer:
dependency: "direct main"
description:
name: flutter_ijkplayer
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.5+1"
flutter_picker:
dependency: "direct main"
description:
... ... @@ -576,6 +590,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.0"
open_iconic_flutter:
dependency: transitive
description:
name: open_iconic_flutter
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.3.0"
package_config:
dependency: transitive
description:
... ... @@ -1017,6 +1038,34 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0-nullsafety.3"
video_player:
dependency: "direct main"
description:
name: video_player
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.1"
video_player_platform_interface:
dependency: transitive
description:
name: video_player_platform_interface
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.0"
video_player_web:
dependency: transitive
description:
name: video_player_web
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.4+1"
wakelock:
dependency: transitive
description:
name: wakelock
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.4+2"
watcher:
dependency: transitive
description:
... ...
... ... @@ -100,6 +100,11 @@ dependencies:
photo: ^0.4.8
#苹果登陆
sign_in_with_apple: ^2.5.1
# video_thumbnail: ^0.2.5
video_player: ^1.0.1
chewie:
# 视频播放
flutter_ijkplayer: 0.3.5+1
... ...