import 'dart:async'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:chat/data/UserData.dart'; import 'package:chat/data/chat_data_mgr.dart'; import 'package:chat/data/group_data_mgr.dart'; import 'package:chat/home/add_friend.dart'; import 'package:chat/home/group_announcement.dart'; import 'package:chat/home/group_manage_page.dart'; import 'package:chat/models/group_info_model.dart'; import 'package:chat/models/money_change.dart'; import 'package:chat/models/ref_name_provider.dart'; import 'package:chat/utils/MessageMgr.dart'; import 'package:chat/utils/group_member_model.dart'; import 'package:chat/utils/msgHandler.dart'; import 'package:chat/utils/screen.dart'; import 'package:chat/utils/sp_utils.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:oktoast/oktoast.dart'; import 'package:provider/provider.dart'; import '../../data/constants.dart'; import '../../generated/i18n.dart'; import '../../r.dart'; import '../../utils/CustomUI.dart'; import '../../utils/FullWithButton.dart'; import '../../utils/app_navigator.dart'; import '../create_group_view.dart'; import 'package:chat/utils/PopUpMenu.dart' as myPop; class TranslationButlerPage extends StatefulWidget { final GroupInfoModel groupInfoModel; TranslationButlerPage({Key key, this.groupInfoModel}) : super(key: key); @override State createState() { return TranslationButlerPageState(); } } class TranslationButlerPageState extends State { int curToLang = 1; int curSourceLang = UserData().language; List langList; @override void initState() { super.initState(); initData(); WidgetsBinding.instance.addPostFrameCallback((_) { Future.delayed(Duration(seconds: 4),(){ CustomUI.buildTranslationHelperOrderDialog(context); }); }); } initData() async{ String time= (await SPUtils.get(Constants.TranslationHelper)); if(time!=null){ print('time:$time'); int second = int.parse(time)~/1000; // if(DateTime.now().millisecondsSinceEpoch~/1000-second>5*3600){ ///超过5小时清除缓存记录 // SPUtils.save(Constants.TranslationHelper,null); // return; // } secondsPassed = ((DateTime.now().millisecondsSinceEpoch~/1000-second)); apply(); }else{ print('time: null'); } } apply(){ isApply = false; timer = Timer.periodic(Duration(seconds: 1), (Timer t){ handleTick(); }); setState(() {}); } @override void didChangeDependencies() { super.didChangeDependencies(); langList = [ I18n.of(context).english, I18n.of(context).Vietnamese, I18n.of(context).traditional_Chinese, I18n.of(context).Simplified_Chinese, I18n.of(context).Korean, I18n.of(context).Japanese, ]; } @override void dispose() { // MessageMgr().off('Update Group Info', updateGroupInfo); timer?.cancel(); if(!isApply && timeStamp!=null){ print('保存时间戳$timeStamp'); SPUtils.save(Constants.TranslationHelper,timeStamp.toString()); } super.dispose(); } _langPopMenu(bool isSource) { var curIndex = isSource ? curSourceLang : curToLang; return myPop.PopupMenuButton( child: Container( constraints: BoxConstraints(minHeight: 41, minWidth: 115, maxWidth: 165), decoration: BoxDecoration( color: Color(0xffD3E7FF), borderRadius: BorderRadius.circular(10)), child: Row( children: [ Expanded( child: Text( langList[curIndex], textAlign: TextAlign.center, textScaleFactor: 1.0, style: TextStyle(color: Color(0xff4A5E76), fontSize: 14), )), Icon(IconData(0xe63b, fontFamily: Constants.IconFontFamily), size: 30, color: Color(0xff4A5E76)) ], ), ), offset: Offset(0, 100), onSelected: (int index) { if (curIndex != index) { if (isSource) { curSourceLang = index; } else { curToLang = index; } print('更换翻译语言'); setState(() {}); } }, itemBuilder: (BuildContext context) { return List>.generate(langList.length, (int i) { return myPop.PopupMenuItem( child: Container( alignment: Alignment.center, color: Colors.white, padding: EdgeInsets.symmetric(vertical: 10, horizontal: 10), child: Text(langList[i], textScaleFactor: 1.0, maxLines: 1, style: TextStyle( color: i == curIndex ? Colors.blueAccent : Color(AppColors.AppBarColor), fontSize: 14)), ), value: i, ); }); }); } @override Widget build(BuildContext context) { Widget appBar = AppBar( backgroundColor: AppColors.NewAppbarBgColor, title: Text( I18n.of(context).translation_butler, textScaleFactor: 1.0, style: TextStyle(color: AppColors.NewAppbarTextColor), ), // leading: CustomUI.buildCustomLeading(context), centerTitle: true, actions: [ Container( child: CustomUI.buildImageLabel(R.assetsImagesCoin, Provider.of(context).money, isLeft: true), decoration: BoxDecoration(borderRadius: BorderRadius.circular(15)), ), SizedBox( width: 10, ) ], ); return Scaffold( appBar: appBar, body: SafeArea( child: Container( color: Color(0xffE8EAF0), child: isApply ? applyPage() : waitPage(), ), ), ); } Widget applyPage() { return ListView( children: [ Padding( padding: EdgeInsets.only(left: 20, right: 10, top: 15), child: Text( I18n.of(context).translation_butler_tips, textScaleFactor: 1.0, style: TextStyle(color: Color(0xffABABAB), fontSize: 13), ), ), Container( margin: EdgeInsets.all(10), child: Card( elevation: 5, // 阴影 shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), // side: BorderSide(color: Colors.green,width: 25), ), child: Container( padding: EdgeInsets.all(10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.only(bottom: 12), child: Text( I18n.of(context).choose_language, textScaleFactor: 1.0, textAlign: TextAlign.left, style: TextStyle( color: AppColors.NewAppbarTextColor, fontSize: 17), ), ), Row( children: [ Image.asset( R.assetsImagesImgTranslationIcon, width: 195, height: 175, ), Column( mainAxisSize: MainAxisSize.min, children: [ _langPopMenu(true), SizedBox(height: 14), InkWell( onTap: () { var temp = curSourceLang; curSourceLang = curToLang; curToLang = temp; setState(() {}); }, child: RotatedBox( quarterTurns: 1, child: Container( child: Icon( IconData( 0xe669, fontFamily: Constants.IconFontFamily, ), size: 24, color: Color(0xff4A5E76), ), padding: EdgeInsets.symmetric( vertical: 5, horizontal: 5), ), ), ), SizedBox(height: 14), _langPopMenu(false), ], ), ], ), Padding( padding: EdgeInsets.only(left: 10, right: 10, top: 15), child: Text( I18n.of(context).translation_butler_rules, textScaleFactor: 1.0, style: TextStyle(color: Color(0xffABABAB), fontSize: 13), ), ), ], ), ), ), ), Container( margin: EdgeInsets.only(left: 70, right: 70, top: 50), height: 47, child: RaisedButton( color: Color(0xff3875E9), shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(10))), child: Text( I18n.of(context).translation_butler_call + ' (50h)', textScaleFactor: 1.0, style: TextStyle(color: Colors.white, fontSize: 19), ), onPressed:(){ timeStamp = DateTime.now().millisecondsSinceEpoch; apply(); } ), ) ], ); } Widget waitPage() { // ~/ 取整操作 int seconds = secondsPassed % 60; int minutes = secondsPassed ~/ 60; return ListView( children: [ ///当前排队人数过多。。。 Container( margin: EdgeInsets.all(10), child: Card( elevation: 5, // 阴影 shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), // side: BorderSide(color: Colors.green,width: 25), ), child: Container( // width: double.maxFinite, // color: Colors.blue, padding: EdgeInsets.fromLTRB(14, 14, 14, 22), child: Column( children: [ Padding( padding: EdgeInsets.only(bottom: 20, top: 10), child: Text( I18n.of(context).translation_butler_tips2, textScaleFactor: 1.0, textAlign: TextAlign.left, style: TextStyle(color: Color(0xff797979), fontSize: 13), ), ), Container( width: double.maxFinite, child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Column( mainAxisAlignment: MainAxisAlignment.center, children: [ fixedText( I18n.of(context).translation_butler_wait_people, fontSize: 16, color: Colors.black), SizedBox( height: 10, ), RichText( maxLines: 3, textAlign: TextAlign.center, text: TextSpan(children: [ TextSpan( text: '333', style: TextStyle( color: Color(0xffFF1010), fontSize: 27)), TextSpan( text: ' ' + I18n.of(context) .translation_butler_wait_people_unit, style: TextStyle( color: Colors.black, fontSize: 17)), ])) ], ), Container( width: 1, height: 65, color: Color(0xffD8D8D8), ), Column( mainAxisAlignment: MainAxisAlignment.center, children: [ fixedText( I18n.of(context).translation_butler_wait_time, fontSize: 16, color: Colors.black), SizedBox( height: 10, ), RichText( maxLines: 3, textAlign: TextAlign.center, text: TextSpan(children: [ TextSpan( text: '666', style: TextStyle( color: Color(0xff3875E9), fontSize: 27)), TextSpan( text: ' ' + I18n.of(context).minute, style: TextStyle( color: Colors.black, fontSize: 17)), ])) ], ), ], ), ) ], ), ), ), ), Padding( padding: EdgeInsets.only(left: 20, right: 10, top: 5,bottom: 10), child: Text( I18n.of(context).translation_butler_tips3, textScaleFactor: 1.0, style: TextStyle(color: Colors.black, fontSize: 18), ), ), Stack(alignment: Alignment.center,children: [ UnconstrainedBox(child: Container( //限制进度条的高度 height: 190.0, //限制进度条的宽度 width: 190.0, child: CircularProgressIndicator( //0~1的浮点数,用来表示进度多少;如果 value 为 null 或空,则显示一个动画,否则显示一个定值 value: null, strokeWidth: 5, //背景颜色 backgroundColor: Color(0xffB2B2B2), //进度颜色 valueColor: AlwaysStoppedAnimation(Color(0xff3875E9))), ),), Column(children: [ Text( I18n.of(context).translation_butler_already_wait, textScaleFactor: 1.0, style: TextStyle(color: Colors.black, fontSize: 19), ), SizedBox(height: 10,), Text( getFull(minutes)+' : '+getFull(seconds) , textScaleFactor: 1.0, style: TextStyle(color: Color(0xffFF1010), fontSize: 35), ) ],) ],), Container( margin: EdgeInsets.only(left: 70, right: 70, top: 50), height: 47, child: RaisedButton( color: Color(0xff3875E9), shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(10))), child: Text( I18n.of(context).translation_butler_cancel, textScaleFactor: 1.0, style: TextStyle(color: Colors.white, fontSize: 19), ), onPressed: () async{ await SPUtils.save(Constants.TranslationHelper,null); setState(() { isApply = true; timer?.cancel(); secondsPassed=0; }); }), ), Container( margin: EdgeInsets.only(left: 70, right: 70, top: 25), height: 47, child: RaisedButton( color: Color(0xffB3B3B3), shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(10))), child: Text( I18n.of(context).translation_butler_wait_service, textScaleFactor: 1.0, style: TextStyle(color: Colors.white, fontSize: 19), ), onPressed: () {}), ) ], ); } bool isApply = true; int secondsPassed = 1; int timeStamp; Timer timer; void handleTick() { // if (isActive) { setState(() { secondsPassed = secondsPassed + 1; //需要更新UI }); // } } getFull(int sec){ return sec<10?'0$sec':'$sec'; } }