import 'dart:async'; import 'dart:io'; import 'package:amap_location_flutter_plugin/amap_location_flutter_plugin.dart'; import 'package:chewie/chewie.dart'; import 'package:flutter/cupertino.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/account/provider/user_provider.dart'; import 'package:liftmanager/internal/bbs/bbs_router.dart'; import 'package:liftmanager/internal/bbs/model/liftcase_model.dart'; import 'package:liftmanager/internal/wode/order_const.dart'; import 'package:liftmanager/internal/wode/page/order_master/check.dart'; import 'package:liftmanager/internal/wode/wode_router.dart'; import 'package:liftmanager/net/api_service.dart'; import 'package:liftmanager/res/colors.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/time_format.dart'; import 'package:liftmanager/utils/toast.dart'; import 'package:liftmanager/utils/utils.dart'; import 'package:liftmanager/widgets/app_bar.dart'; import 'package:liftmanager/widgets/bbs_content.dart'; import 'package:liftmanager/widgets/load_image.dart'; import 'package:liftmanager/widgets/selected_video_change.dart'; import 'package:orientation/orientation.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; import 'package:video_player/video_player.dart'; class OrderDetailMaster extends StatefulWidget { OrderDetailMaster(this.id); final String id; @override State createState() { return OrderDetailMasterState(); } } class OrderDetailMasterState extends State with AutomaticKeepAliveClientMixin { UserProvider provider = UserProvider(); bool _hasData = false; LiftCasesDetailModel detailObj; double totalPay; String videoUrl; String str; String imagesUrl; double percent = 0.0; var latitude; var longitude; String address; Map _locationResult; StreamSubscription> _locationListener; AmapLocationFlutterPlugin _locationPlugin = new AmapLocationFlutterPlugin(); getBrandDetail() { // showLoading(context); NewApiService().getLiftcaseDetail(widget.id, onSuccess: (res) { detailObj = res; print("获取详情成功"); if (_controllerBefore == null && detailObj.beforeRepair != null) { _controllerBefore?.pause(); _controllerBefore?.dispose(); _controllerBefore = VideoPlayerController.network( Utils.getImagePath(detailObj.beforeRepair)); } if (_controllerAfter == null && detailObj.afterRepair != null) { _controllerAfter?.pause(); _controllerAfter?.dispose(); _controllerAfter = VideoPlayerController.network( Utils.getImagePath(detailObj.afterRepair)); } double serviceCost = detailObj.serviceCost != null ? detailObj.serviceCost : 0.0; double travelCost = detailObj.travelCost != null ? detailObj.travelCost : 0.0; double couponDeduction = detailObj.couponDeduction != null ? detailObj.couponDeduction : 0.0; double redEnvelopeDeduction = detailObj.redEnvelopeDeduction != null ? detailObj.redEnvelopeDeduction : 0.0; totalPay = (serviceCost + travelCost) - (couponDeduction + redEnvelopeDeduction); if (totalPay < 0) { totalPay = 0.0; } _hasData = true; // dismissLoading(context); setState(() {}); }, onError: (code, msg) { // dismissLoading(context); toasts(msg); }); } VideoPlayerController _controllerBefore; VideoPlayerController _controllerAfter; // 确认完成 void _confirmComplete() { showLoading(context); NewApiService().chargeMakeSureCase({ "id": widget.id, }, onSuccess: (res) { toasts("确认完成"); getBrandDetail(); dismissLoading(context); setState(() {}); }, onError: (code, msg) { dismissLoading(context); toasts(msg); }); } @override void initState() { if (this.mounted) { getBrandDetail(); } super.initState(); // _locationListener = _locationPlugin // .onLocationChanged() // .listen((Map result) { // setState(() { // _locationPlugin.stopLocation(); // _locationResult = result; // // address latitude longitude // _locationResult.forEach((key, value) { // if (key == 'address') { // address = '$value'; // setState(() {}); // } else if (key == 'latitude') { // latitude = double.parse('$value'); // setState(() {}); // } else if (key == 'longitude') { // longitude = double.parse('$value'); // setState(() {}); // } // print(111); // print('key:$key :'); // print('value:$value :'); // }); // }); // }); // getLocation(); } @override void dispose() { _controller?.pause(); _controller?.dispose(); _chewieController?.dispose(); if (detailObj.beforeRepair != null) { _controllerBefore?.pause(); _controllerBefore?.dispose(); } if (detailObj.afterRepair != null) { _controllerAfter?.pause(); _controllerAfter?.dispose(); } // SystemChrome.setPreferredOrientations([ // DeviceOrientation.portraitUp, // ]); OrientationPlugin.forceOrientation(DeviceOrientation.portraitUp); // provider.dispose(); super.dispose(); } getHeight(detailObj) { bool isHeight = false; if ((OrderConstant.isShow( detailObj.statuz, detailObj.dataTable, 'showExpertQuoteButton')) || (OrderConstant.isShow(detailObj.statuz, detailObj.dataTable, 'showExpertPunchButton') && detailObj.arrivedFlag == 0) || (OrderConstant.isShow(detailObj.statuz, detailObj.dataTable, 'showExpertConfirmOrderButton', arrivedFlag: detailObj.arrivedFlag)) || (OrderConstant.isShow(detailObj.statuz, detailObj.dataTable, 'showExpertArchiveButton'))) { isHeight = true; } return isHeight; } @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; double height = MediaQuery.of(context).size.height; if (width > height) { // SystemChrome.setPreferredOrientations([ // DeviceOrientation.portraitUp, // ]); OrientationPlugin.forceOrientation(DeviceOrientation.portraitUp); } return ChangeNotifierProvider( create: (_) => provider, child: Scaffold( appBar: MyAppBar( centerTitle: "订单详情", ), body: _hasData ? Consumer( builder: (_, provider, __) { return SafeArea( child: Stack( children: [ ListView( padding: EdgeInsets.all(0.0), children: [ _orderTypeHead(), _lineSpase(), _orderUserDetail(), isShowMoneyDetail() ? _lineSpase() : Container(), isShowMoneyDetail() ? _orderMoneyDetail() : Container(), _lineSpase(), _orderTime(), _lineSpase(), OrderConstant.isShow( detailObj.statuz, detailObj.dataTable, 'showExpertPunchButton') && detailObj.arrivedFlag == 0 ? _uploadLiveVideo() : Container(), OrderConstant.isShow( detailObj.statuz, detailObj.dataTable, 'showExpertConfirmOrderButton', arrivedFlag: detailObj.arrivedFlag) && detailObj.dataTable == 2 ? _uploadLiveVideo() : Container(), (detailObj.dataTable == 1 && detailObj.arrivedFlag == 5 && detailObj.examineFlag == '2') ? _boHuiTip() : Container(), isShowOrderLive() ? _orderLiveVideo() : Container(), SizedBox(height: 80), ]), Positioned( bottom: 0, left: 0, child: Container( width: width, height: !getHeight(detailObj) ? 0 : 60, padding: EdgeInsets.only( // right: ScreenUtil().setWidth(15), // left: ScreenUtil().setWidth(15), top: 7.5, bottom: 7.5, ), decoration: BoxDecoration( border: Border( top: BorderSide( width: 0.5, color: Color(0xffeeeeee)), ), color: ThemeUtils.getDialogTextFieldColor(context), ), child: Row( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.center, children: [ OrderConstant.isShow( detailObj.statuz, detailObj.dataTable, 'showExpertQuoteButton') ? BottomBtn( title: detailObj.statuz == 1 ? "立即报价" : "修改报价", fun: () { if (_controllerBefore != null) { _controllerBefore?.pause(); } if (_controllerAfter != null) { _controllerAfter?.pause(); } NavigatorUtils.push(context, "${WodeRouter.baoPrice}?id=${detailObj.id}&travelCost=${detailObj.travelCost != null ? detailObj.travelCost.toString() : ''}&serviceCost=${detailObj.serviceCost != null ? detailObj.serviceCost.toString() : ''}"); }, ) : Container(child: null), // detailObj.statuz == 3 || detailObj.statuz == 6 // ? BottomBtn( // title: "上传视频", // fun: () { // // NavigatorUtils.push(context,WodeRouter.representations); // }, // ) // : Container(child: null), OrderConstant.isShow( detailObj.statuz, detailObj.dataTable, 'showExpertPunchButton') && detailObj.arrivedFlag == 0 ? BottomBtn( title: "立即打卡", fun: () { punchin(); // if (_controllerBefore != null) { // _controllerBefore.pause(); // } // if (_controllerAfter != null) { // _controllerAfter.pause(); // } // NavigatorUtils.push(context, // "${WodeRouter.punchin}?id=${detailObj.id}"); }, ) : Container(child: null), OrderConstant.isShow( detailObj.statuz, detailObj.dataTable, 'showExpertConfirmOrderButton', arrivedFlag: detailObj.arrivedFlag) ? BottomBtn( title: "确认完成", fun: () { if (detailObj.dataTable == 1) { _confirmComplete(); } else { submitApply(); // punchin(); // if (_controllerBefore != null) { // _controllerBefore.pause(); // } // if (_controllerAfter != null) { // _controllerAfter.pause(); // } // NavigatorUtils.push(context, // "${WodeRouter.confirmOrder}?id=${detailObj.id}"); } }, ) : Container(child: null), OrderConstant.isShow( detailObj.statuz, detailObj.dataTable, 'showExpertArchiveButton', examineFlag: detailObj .questionBankEntity?.examineFlag) ? BottomBtn( title: detailObj.questionBankEntity ?.examineFlag == 2 ? '重新提交' : "立即归档", fun: () { if (_controllerBefore != null) { _controllerBefore.pause(); } if (_controllerAfter != null) { _controllerAfter.pause(); } NavigatorUtils.push(context, "${WodeRouter.archive}?id=${detailObj.id}"); }, ) : Container(child: null), ], ), ), ) ], ), ); }, ) : Center( child: Text("正在加载..."), ), ), ); } _lineSpase() { return Container( color: ThemeUtils.getDialogTextFieldColor(context), height: ScreenUtil().setWidth(5), ); } _orderTypeHead() { return Container( // decoration: BoxDecoration( // gradient: const LinearGradient( // colors: [Color(0xFF00D9FF), Color(0xFF0287FF)], // ), // ), padding: EdgeInsets.only( top: ScreenUtil().setWidth(10), left: ScreenUtil().setWidth(10)), height: ScreenUtil().setWidth(90), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( // crossAxisAlignment: CrossAxisAlignment.start, // mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( // : 0xe604, OrderConstant.getIconFontCode( detailObj.statuz, detailObj.dataTable), size: 20.0, color: Color(0xff333333), ), SizedBox( width: 5, ), Text( OrderConstant.getStatusName( detailObj.statuz, detailObj.dataTable, arrivedFlag: detailObj.arrivedFlag, userType: 'Expert', examineFlag: detailObj.questionBankEntity?.examineFlag), textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(14), color: Colours.text, ), ), Expanded(child: Container()), Text( '订单号:', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(14), color: Colours.text, ), ), Text( '${detailObj.orderNo ?? '无'}', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(14), color: Colours.text_gray, ), ), // SizedBox( width: 10, ) ], ), Container( margin: EdgeInsets.only(left: 25, top: 10), child: Text( // '', OrderConstant.getdetailStatusName( detailObj.statuz, detailObj.dataTable, arrivedFlag: detailObj.arrivedFlag, userType: 'Expert'), textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(13), color: Colours.dark_text_gray, ), ), ) ], ), ); } _orderUserDetail() { return Container( // height: 20, padding: EdgeInsets.only( bottom: ScreenUtil().setWidth(20), top: ScreenUtil().setWidth(10)), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: GestureDetector( onTap: () { if (_controllerBefore != null) { _controllerBefore?.pause(); } if (_controllerAfter != null) { _controllerAfter?.pause(); } NavigatorUtils.push(context, "${BbsRouter.recommendAsk}?id=${detailObj.id}&type=3"); }, child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( width: 10, ), ClipRRect( borderRadius: BorderRadius.circular(20), child: LoadNetworkImage( detailObj.avatarUrl, width: ScreenUtil().setWidth(43), height: ScreenUtil().setWidth(43), // alignment: Alignment.centerLeft, ), // Container( // margin: EdgeInsets.only( // left: ScreenUtil().setWidth(15), // right: ScreenUtil().setWidth(10), // // top: ScreenUtil().setWidth(5) // ), // decoration: BoxDecoration( // borderRadius: BorderRadius.circular( // ScreenUtil().setWidth(22)), // ), // child: LoadNetworkImage( // detailObj.avatarUrl, // width: ScreenUtil().setWidth(43), // height: ScreenUtil().setWidth(43), // // alignment: Alignment.centerLeft, // ), // ), ), SizedBox( width: 10, ), Expanded( child: Container( padding: EdgeInsets.only(right: ScreenUtil().setWidth(15)), child: Column( children: [ Container( child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( detailObj.name ?? '', style: TextStyle( fontSize: ScreenUtil().setSp(17), ), textAlign: TextAlign.start, ), Container( decoration: BoxDecoration( //背景 color: detailObj.dataTable == 1 ? Colours.blue_app_main : Color(0xffFDAF2C), //设置四周圆角 角度 borderRadius: BorderRadius.all( Radius.circular(4.0)), ), margin: EdgeInsets.only(left: 5), padding: EdgeInsets.only( left: 5, right: 5, top: 2, bottom: 2), child: Text( detailObj.dataTable == 1 ? '问诊服务' : '出诊服务', style: TextStyle( color: Colors.white, fontSize: ScreenUtil().setSp(14), ), textAlign: TextAlign.start, ), ), ], ), ], ), ), Container( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( detailObj.createTime != null ? DateUtils.instance.getFormartData( timeSamp: detailObj.createTime, format: "MM月dd日") : '', style: TextStyle( color: Color(0xff999999), fontSize: ScreenUtil().setSp(13), ), textAlign: TextAlign.start, ), Container( padding: EdgeInsets.only(left: 5), child: Text( detailObj.brandName ?? '', style: TextStyle( color: Colours.blue_app_main, fontSize: ScreenUtil().setSp(13), ), textAlign: TextAlign.start, ), ) ], ), ], ), ), detailObj.dataTable != 1 ? Container( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( // padding: EdgeInsets.only(left: 5), child: Text( '出诊时间:', style: TextStyle( color: Color(0xff999999), fontSize: ScreenUtil().setSp(13), ), textAlign: TextAlign.start, ), ), Text( detailObj.arrivedTime != null ? DateUtils.instance .getFormartData( timeSamp: detailObj .arrivedTime, format: "MM月dd日 HH:mm") : '', style: TextStyle( color: Color(0xff666666), fontSize: ScreenUtil().setSp(13), ), textAlign: TextAlign.start, ), ], ), ], ), ) : Container(), detailObj.dataTable != 1 ? Container( // margin: EdgeInsets.only(top: 6), child: Row( children: [ Container( // padding: EdgeInsets.only(left: 5), child: Text( '出诊地点:', style: TextStyle( color: Color(0xff999999), fontSize: ScreenUtil().setSp(13), ), textAlign: TextAlign.start, ), ), Container( width: ScreenUtil().setWidth(230), child: Text( '${detailObj.address ?? ''}', style: TextStyle( color: Color(0xff666666), fontSize: ScreenUtil().setSp(13), // color: Color(0xff666666), // fontSize: ScreenUtil().setSp(15), ), textAlign: TextAlign.start, maxLines: 1, overflow: TextOverflow.ellipsis, ), ), ], ), ) : Container(), Container( // margin: EdgeInsets.only(top: 6), child: Row( children: [ Container( // padding: EdgeInsets.only(left: 5), child: Text( '问题描述:', style: TextStyle( color: Color(0xff999999), fontSize: ScreenUtil().setSp(13), ), textAlign: TextAlign.start, ), ), Container( width: ScreenUtil().setWidth(230), child: Text( '${detailObj.expression ?? ''}', style: TextStyle( color: Color(0xff666666), fontSize: ScreenUtil().setSp(13), // color: Color(0xff666666), // fontSize: ScreenUtil().setSp(15), ), textAlign: TextAlign.start, maxLines: 1, overflow: TextOverflow.ellipsis, ), ), ], ), ), Container( // margin: EdgeInsets.only(top: 6), child: Row( children: [ Container( // padding: EdgeInsets.only(left: 5), child: Text( '出厂日期:', style: TextStyle( color: Color(0xff999999), fontSize: ScreenUtil().setSp(13), ), textAlign: TextAlign.start, ), ), Container( width: ScreenUtil().setWidth(230), child: Text( '${detailObj.productionDate ?? ''}', style: TextStyle( color: Color(0xff666666), fontSize: ScreenUtil().setSp(13), // color: Color(0xff666666), // fontSize: ScreenUtil().setSp(15), ), textAlign: TextAlign.start, maxLines: 1, overflow: TextOverflow.ellipsis, ), ), ], ), ), // Container( // child: Row( // mainAxisAlignment: // MainAxisAlignment.start, // children: [ // Row( // crossAxisAlignment: // CrossAxisAlignment // .center, // children: [ // Text( // detailObj.createTime != // null // ? DateUtils // .instance // .getFormartData( // timeSamp: // detailObj // .createTime, // format: // "MM月dd日", // ) // : '', // style: TextStyle( // color: Color( // 0xff999999), // fontSize: // ScreenUtil() // .setSp( // 13), // ), // textAlign: // TextAlign.left, // ), // Container( // padding: // EdgeInsets.only( // left: 5), // child: Text( // detailObj // .brandName ?? // '', // style: TextStyle( // color: Color( // 0xff999999), // fontSize: // ScreenUtil() // .setSp( // 13), // ), // textAlign: // TextAlign // .left, // ), // ) // ], // ), // ], // ), // ), // Row( // mainAxisAlignment: // MainAxisAlignment.start, // children: [ // Container( // width: 260, // child: Text( // detailObj.expression ?? // '', // style: TextStyle( // color: // Color(0xff0288FF), // fontSize: ScreenUtil() // .setSp(15), // ), // textAlign: // TextAlign.left, // maxLines: 1, // overflow: TextOverflow // .ellipsis, // ), // ), // ], // ), ], ), ), ) ], ), ), ), ], ), ); } _orderMoneyDetail() { return Column( children: [ detailObj.dataTable == 2 ? Heng( left: "差旅费", right: detailObj.travelCost != null ? "¥" + detailObj.travelCost.toString() : '¥0', leftColor: 0xff333333, rightColor: 0xff333333, ) : Container(), Heng( left: "技术服务费", right: detailObj.serviceCost != null ? "¥" + detailObj.serviceCost.toString() : '¥0', leftColor: 0xff333333, rightColor: 0xff333333, ), Heng( left: "优惠券抵扣", right: detailObj.couponDeduction != null ? "-¥" + detailObj.couponDeduction.toString() : '-¥0', leftColor: 0xff333333, rightColor: 0xff333333, ), Heng( left: "红包抵扣", right: detailObj.redEnvelopeDeduction != null ? "-¥" + detailObj.redEnvelopeDeduction.toString() : '-¥0', leftColor: 0xff333333, rightColor: 0xff333333, ), Heng( left: "实付款", right: detailObj.payCost != null && getPayCost() ? "¥" + detailObj.payCost.toString() : '¥' + totalPay.toStringAsFixed(2).toString(), leftColor: 0xff333333, rightColor: 0xffFD0808, ), ], ); } _orderTime() { return Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(10), bottom: ScreenUtil().setWidth(10)), child: Row( children: [ Text( '下单时间:', textAlign: TextAlign.left, style: TextStyle( fontSize: 14, color: Color(0xff333333), ), ), Text( detailObj.createTime != null ? DateUtils.instance.getFormartData( timeSamp: detailObj.createTime, format: "yyyy-MM-dd HH:mm:ss") : '', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(13), color: Color(0xff999999), ), ), ], ), ); } ///现场视频维修前维修后 _orderLiveVideo() { double width = MediaQuery.of(context).size.width; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: width, padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(10), bottom: ScreenUtil().setWidth(10)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: .5, color: Color(0xfff5f5f5)), ), ), child: Text( '现场情况(维修前)', textAlign: TextAlign.left, style: TextStyle( fontSize: 17, color: Color(0xff333333), ), ), ), detailObj.beforeRepair != null ? 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( videoPlayerController: // VideoPlayerController.network( // Utils.getImagePath(detailObj.beforeRepair) // // imgFontUrl + detailObj.url // ) _controllerBefore, aspectRatio: 3 / 2, autoPlay: false, looping: true, 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, ), ), ), )) : Container( padding: EdgeInsets.only(left: 15), child: Text("暂无"), ), Container( width: width, padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(10), bottom: ScreenUtil().setWidth(10)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: .5, color: Color(0xfff5f5f5)), ), ), child: Text( '现场情况(维修后)', textAlign: TextAlign.left, style: TextStyle( fontSize: 17, color: Color(0xff333333), ), ), ), detailObj.afterRepair != null ? 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( videoPlayerController: // VideoPlayerController.network( // Utils.getImagePath(detailObj.afterRepair) // // imgFontUrl + detailObj.url // ) _controllerAfter, aspectRatio: 3 / 2, autoPlay: false, looping: true, 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, ), ), ), )) : Container( padding: EdgeInsets.only(left: 15), child: Text("暂无"), ), ], ); } _boHuiTip() { double width = MediaQuery.of(context).size.width; return Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(10), bottom: ScreenUtil().setWidth(10)), child: Column( children: [ detailObj.questionBankEntity != null ? Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '驳回原因:', textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(13), color: Color(0xff666666), ), ), Container( width: width * 0.75, child: Text( detailObj.questionBankEntity?.notExamineReason ?? "", textAlign: TextAlign.left, style: TextStyle( fontSize: ScreenUtil().setSp(13), color: Color(0xff666666), ), ), ) ], ) : Container( child: null, ), ], ), ); } _uploadLiveVideo() { return Column( children: [ detailObj.arrivedFlag != 1 ? Row( children: [ Container( height: 11, width: 2, color: Colours.blue_app_main, ), SizedBox( width: 13, ), Text('打卡信息') ], ) : Container(), detailObj.arrivedFlag != 1 ? Container( height: 40, child: InkWell( onTap: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => ExpertCheckPage( backFun: (lat, lon, add) { latitude = lat; longitude = lon; address = add; print(address); setState(() {}); }, ))); }, child: Row( children: [ SizedBox( width: 15, ), Icon( const IconData(0xe638, fontFamily: "Iconfont"), size: 17.0, color: Colours.blue_app_main, ), Text( '${address ?? '点击查看位置'}', style: TextStyle(color: Colours.blue_app_main), ), Expanded(child: Container()), Icon( Icons.arrow_forward_ios, size: 12, color: Color(0xff999999), ), SizedBox( width: 15, ), ], ), ), ) : Container(), Row( children: [ Container( height: 11, width: 2, color: Colours.blue_app_main, ), SizedBox( width: 13, ), Text(detailObj.arrivedFlag != 1 ? '现场情况(维修前)' : '现场情况(维修后)') ], ), Container( // color: ThemeUtils.getDialogTextFieldColor(context), // color: Colors.red, child: GridView.builder( shrinkWrap: true, padding: const EdgeInsets.fromLTRB(8.0, 0, 8.0, 12.0), physics: NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 1, childAspectRatio: 1.5), 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: () { 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, ) ], ); }, ), ) ], ); } _orderSSInfo() { return Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(10), bottom: ScreenUtil().setWidth(10)), child: Column( children: [ Row( children: [ Text( '申诉内容:', textAlign: TextAlign.left, style: TextStyle( fontSize: 14, color: Color(0xff333333), ), ), Text( detailObj.liftCaseAppealEntity != null && detailObj.liftCaseAppealEntity.content != null ? detailObj.liftCaseAppealEntity.content : '', textAlign: TextAlign.left, style: TextStyle( fontSize: 14, color: Color(0xff999999), ), ), ], ), Row( children: [ Text( '申诉时间:', textAlign: TextAlign.left, style: TextStyle( fontSize: 14, color: Color(0xff333333), ), ), Text( detailObj.liftCaseAppealEntity != null && detailObj.liftCaseAppealEntity.createTime != null ? DateUtils.instance.getFormartData( timeSamp: detailObj.liftCaseAppealEntity.createTime, format: "yyyy-MM-dd HH:mm:ss") : '', textAlign: TextAlign.left, style: TextStyle( fontSize: 14, color: Color(0xff999999), ), ), ], ), ], ), ); } VideoPlayerController _controller; VideoPlayerController _controllerFile; ChewieController _chewieController; ///选择图片 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("没有权限,无法打开相册!"); } } upLoadFileOnce(path) { showLoading(context, "正在上传..."); NewApiService().upload(path, onSuccess: (res) { dismissLoading(context); setState(() { videoUrl = res.pathUrl; imagesUrl = res.coverUrl; }); }, onError: (code, msg) { dismissLoading(context); toasts(msg); }); } void _uploadImage(filePath) async { showPercent(context, () { dismissLoading(context); toasts("上传失败"); }, () { if (videoUrl == null && str != null) { setState(() { videoUrl = str; settingVideoVC(); 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); }); } settingVideoVC() { _controller?.pause(); _controller?.dispose(); _chewieController?.dispose(); _controller = VideoPlayerController.network(Utils.getImagePath(videoUrl) // imgFontUrl + detailObj.url ); _chewieController = ChewieController( videoPlayerController: // VideoPlayerController.network( // imgFontUrl + detailObj.url // ), _controller, aspectRatio: 3 / 2, autoPlay: false, looping: true, 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, ), ); } Widget videoPlay() { if (_controller == null) return Container(); double width = MediaQuery.of(context).size.width; return Container( width: width, height: width * 2 / 3, 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), )); } // 获取定位权限 Future requestPermission() async { final permissions = await PermissionHandler() .requestPermissions([PermissionGroup.location]); if (permissions[PermissionGroup.location] == PermissionStatus.granted) { return true; } else { toasts('需要定位权限!'); return false; } } // 获取位置信息 Future punchin() async { ///开始定位之前设置定位参数 if (longitude == null) { toasts("请选择打卡地点"); return; } if (longitude != null && latitude != null) { if (videoUrl == null || videoUrl == '') { toasts("请上传视频"); return; } showLoading(context); NewApiService().chargeToClock({ "id": detailObj.id, "lng": longitude, "lat": latitude, "beforeRepair": videoUrl, }, onSuccess: (res) { dismissLoading(context); toasts("确认打卡成功"); if (_controller != null) { _controller.pause(); } getBrandDetail(); // NavigatorUtils.push( // context, "${WodeRouter.orderPageMaster}?checkType=0"); setState(() {}); }, 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); }); } getPayCost() { bool isPay = true; if ((detailObj.dataTable == 1 && detailObj.statuz == 0) || (detailObj.dataTable == 2 && detailObj.statuz == 2)) { isPay = false; } return isPay; } isShowMoneyDetail() { bool show = true; if (detailObj.dataTable == 2) { switch (detailObj.statuz) { case 0: case 1: show = false; break; default: } } // if ((detailObj.dataTable == 2 && (detailObj.statuz == 2)) || // (detailObj.dataTable == 2 && detailObj.statuz == 2)) { // show = false; // } return show; } isShowOrderLive() { bool show = false; if (detailObj.dataTable == 2) { show = true; switch (detailObj.statuz) { case 0: case 1: case 2: case 3: { if (detailObj.arrivedFlag == 2) { show = true; } else { show = false; } } break; default: } } return show; } @override bool get wantKeepAlive => true; } class BottomBtn extends StatelessWidget { BottomBtn({Key key, this.title, this.fun}) : super(key: key); Function fun; String title; @override Widget build(BuildContext context) { return Expanded( // margin: EdgeInsets.only(left: 10), child: GestureDetector( onTap: () { fun(); }, child: Container( child: Container( margin: EdgeInsets.only(left: 15, right: 15), // // height:22, // padding: EdgeInsets.only( // left: ScreenUtil().setWidth(20), // right: ScreenUtil().setWidth(20), // ), decoration: BoxDecoration( border: Border.all(width: 1, color: Color(0xff1B87F6)), borderRadius: BorderRadius.circular(23), color: Colours.blue_app_main), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( title, textAlign: TextAlign.center, style: TextStyle( fontSize: ScreenUtil().setSp(15), color: Colors.white, ), ), ], ), ), ), ), ); } }