import 'dart:io'; import 'package:chewie/chewie.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:image_picker/image_picker.dart'; import 'package:liftmanager/internal/wode/wode_router.dart'; import 'package:liftmanager/net/api_service.dart'; import 'package:liftmanager/routers/fluro_navigator.dart'; import 'package:liftmanager/utils/fast_notification.dart'; import 'package:liftmanager/utils/oss_upload.dart'; import 'package:liftmanager/utils/theme_utils.dart'; import 'package:liftmanager/utils/toast.dart'; import 'package:liftmanager/utils/utils.dart'; import 'package:liftmanager/widgets/app_bar.dart'; import 'package:liftmanager/widgets/selected_video_change.dart'; import 'package:video_player/video_player.dart'; class ConfirmOrder extends StatefulWidget { ConfirmOrder(this.id); final String id; @override State createState() { return ConfirmOrderState(); } } class ConfirmOrderState extends State { VideoPlayerController _controller; VideoPlayerController _controllerFile; ChewieController _chewieController; // final FijkPlayer player = FijkPlayer(); // List imagesUrl = []; // List videoUrl = []; String videoUrl; String str; String imagesUrl; double percent = 0.0; @override void initState() { super.initState(); } @override void dispose() { // TODO: implement dispose _controller?.pause(); _controller?.dispose(); _chewieController?.dispose(); super.dispose(); } ///选择图片 void selectPicker() { showDialog( context: context, builder: (BuildContext context) { return SimpleDialog( title: Text("选择方式"), children: ["拍照", '从手机相册选择'].map((String value) { print("$value"); return SimpleDialogOption( child: Text( "${value}", style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500), ), onPressed: () { _getImage(value == '拍照' ? 1 : 0); Navigator.of(context).pop(); }, ); }).toList(), ); }, ); } void _getImage(int key) async { print(key); print(333); try { await ImagePicker.pickVideo( source: key == 1 ? ImageSource.camera : ImageSource.gallery, ).then((File f) async { if (f != null) { _controllerFile = VideoPlayerController.file(f); _controllerFile.initialize().then((val) { _controllerFile.setLooping(true); int seconds = _controllerFile.value.duration.inSeconds; print("视频时长:$seconds"); int fileSize = f.lengthSync(); //单位B print("视频大小:${fileSize}"); print("视频大小:${f.path}"); if (seconds <= 300) { _uploadImage(f.path); // upLoadFileOnce(_imageFile.path); // setState(() {}); } else { toasts("视频时长不能大于5分钟!"); } }).catchError((error) { print(error); print("error"); toasts("上传失败,不支持此格式"); }); } }); } catch (e) { toasts("没有权限,无法打开相册!"); } } void _uploadImage(filePath) async { showPercent(context, () { dismissLoading(context); toasts("上传失败"); }, () { if (videoUrl == null && str != null) { setState(() { videoUrl = str; _controller?.pause(); _controller?.dispose(); _controller = VideoPlayerController.network(Utils.getImagePath(videoUrl) // imgFontUrl + detailObj.url ); print("videoUrl:" + videoUrl); dismissLoading(context); toasts("上传成功"); }); } }); String uploadName = OssUtil.instance.getImageUploadName(filePath); await NewApiService.uploadImage(context, uploadName, filePath).then((data) { if (data.statusCode == 200) { str = NewApiUrl.URL_UPLOAD_IMAGE_OSS + "/" + uploadName; print("str:" + str); print(videoUrl); if (str != null) { Map obj = {"uploadName": uploadName, "success": true}; FastNotification.push("percent", obj); } } else { Map obj = {"uploadName": uploadName, "success": false}; FastNotification.push("percent", obj); } }).catchError((data) { Map obj = {"uploadName": uploadName, "success": false}; FastNotification.push("percent", obj); }); } upLoadFileOnce(path) { showLoading(context, "正在上传..."); NewApiService().upload(path, onSuccess: (res) { dismissLoading(context); setState(() { videoUrl = res.pathUrl; imagesUrl = res.coverUrl; settingVideoVc(); }); }, onError: (code, msg) { dismissLoading(context); toasts(msg); }); } submitApply() { if (videoUrl == null || videoUrl == '') { toasts("请上传视频"); return; } showLoading(context); NewApiService().chargeMakeSureCase({ "id": widget.id, "afterRepair": videoUrl, }, onSuccess: (res) { dismissLoading(context); toasts("确认完成"); if (_controller != null) { _controller.pause(); } NavigatorUtils.push(context, "${WodeRouter.orderPageMaster}?checkType=0"); setState(() {}); }, onError: (code, msg) { dismissLoading(context); toasts(msg); }); } settingVideoVc() { _controller?.pause(); _controller?.dispose(); _chewieController?.dispose(); _controller = VideoPlayerController.network(Utils.getImagePath(videoUrl)); _chewieController = ChewieController( videoPlayerController: // VideoPlayerController.network( // imgFontUrl + detailObj.url // ), _controller, aspectRatio: 3 / 2, allowFullScreen: false, autoPlay: false, looping: true, // startAt: Duration(seconds: 1,minutes: 1), showControls: true, deviceOrientationsAfterFullScreen: [DeviceOrientation.portraitUp], // 占位图 // placeholder: Image.network( // imgFontUrl+detailObj.cover, // fit: BoxFit.contain, // ), // 是否在 UI 构建的时候就加载视频 autoInitialize: true, // 拖动条样式颜色 materialProgressColors: new ChewieProgressColors( playedColor: Colors.red, handleColor: Colors.blue, backgroundColor: Colors.grey, bufferedColor: Colors.lightGreen, ), ); } // 文本编辑控制 GlobalKey _formKey = new GlobalKey(); @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; return Scaffold( resizeToAvoidBottomPadding: false, //不让键盘弹上去 appBar: MyAppBar( centerTitle: "确认订单", ), body: Container( child: ListView( children: [ Form( key: _formKey, //设置globalKey,用于后面获取FormState // autovalidate: true, //开启自动校验 child: Column( children: [ Container( width: width, padding: EdgeInsets.only(left: 15, bottom: 15), child: Text( "(建议时长3分钟,建议大小50M)", style: TextStyle( color: Colors.red, fontSize: ScreenUtil().setSp(14), ), textAlign: TextAlign.left, ), ), // Container( // color: Colors.white, // child: GridView.builder( // shrinkWrap: true, // padding: const EdgeInsets.fromLTRB(8.0, 12, 8.0, 12.0), // physics: NeverScrollableScrollPhysics(), // gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( // crossAxisCount: 3, childAspectRatio: 1.18), // itemCount: 1, // itemBuilder: (_, index) { // return Stack( // children: [ // Center( // child: SelectedImage( // image: imagesUrl, // index: index, // onTap: () { // selectPicker(); // FocusScope.of(context).requestFocus(FocusNode()); // }, // ), // ), // videoUrl != null // ? Positioned( // top: 0, // right: 0, // child: GestureDetector( // onTap: () { // print(index); // videoUrl = null; // imagesUrl = null; // setState(() {}); // }, // child: Icon( // IconData(0xe62a, fontFamily: "Iconfont"), // size: 24.0, // color: Color(0xff999999), // ), // ), // ) // : Container( // child: null, // ) // ], // ); // }, // ), // ), Container( color: ThemeUtils.getDialogTextFieldColor(context), child: GridView.builder( shrinkWrap: true, padding: const EdgeInsets.fromLTRB(8.0, 12, 8.0, 12.0), physics: NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 1, childAspectRatio: 1.18), itemCount: 1, itemBuilder: (_, index) { return Stack( children: [ Center( child: SelectedVideo( image: videoUrl, index: index, videoPlay: videoPlay(), onTap: () { if (videoUrl == null) { selectPicker(); } }, ), ), videoUrl != null ? Positioned( top: 0, right: 0, child: GestureDetector( onTap: () { print(index); // imagesUrl = null; setState(() { videoUrl = null; str = null; _controller.pause(); // player.reset(); }); }, child: Icon( const IconData(0xe651, fontFamily: "Iconfont"), size: 24.0, color: Color(0xff999999), ), ), ) : Container( child: null, ) ], ); }, ), ), Container( height: ScreenUtil().setWidth(44), decoration: BoxDecoration( borderRadius: BorderRadius.circular(ScreenUtil().setWidth(22)), gradient: const LinearGradient( colors: [Color(0xFF00D9FF), Color(0xFF0287FF)]), ), margin: EdgeInsets.all(20.0), width: double.infinity, child: FlatButton( // padding: EdgeInsets.all(15.0), child: Text("提交"), // color: Theme // .of(context) // .primaryColor, textColor: Colors.white, onPressed: () { /* * 如果:context不对。可以使用GlobalKey, * 通过_formKey.currentState 获取FormState后, * 调用validate()方法校验用户名密码是否合法,校验 * 通过后再提交数据。 */ if ((_formKey.currentState as FormState).validate()) { submitApply(); } }, ), ), ], ), ), ], ), ), ); } Widget videoPlay() { if (_controller == null) return Container(); double width = MediaQuery.of(context).size.width; return Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), right: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(15)), child: ClipRRect( borderRadius: BorderRadius.circular(5), child: new Chewie(controller: _chewieController), )); } }