import 'package:cached_network_image/cached_network_image.dart'; import 'package:chat/data/UserData.dart'; import 'package:chat/data/constants.dart'; import 'package:chat/generated/i18n.dart'; import 'package:chat/models/list_msg_model.dart'; import 'package:chat/r.dart'; import 'package:chat/utils/CustomUI.dart'; import 'package:chat/utils/HttpUtil.dart'; import 'package:chat/utils/TokenMgr.dart'; import 'package:chat/utils/screen.dart'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:oktoast/oktoast.dart'; import 'package:url_launcher/url_launcher.dart'; class QuestionModel { final String question; final int index; QuestionModel({this.question, this.index}); QuestionModel.fromJson(Map json) : question = json['Question'], index = json['Number']; } class ServiceMsgModel { final bool isMe; final List msg; ServiceMsgModel({this.isMe, this.msg}); } class ServiceCenterPage extends StatefulWidget { final int questionIndex; ServiceCenterPage({this.questionIndex = -1}); @override _ServiceCenterPageState createState() => _ServiceCenterPageState(); } class _ServiceCenterPageState extends State { final TextEditingController _textCtrl = new TextEditingController(); List questions = []; ScrollController _scrollCtrl = new ScrollController(); ListModel _list; GlobalKey _listKey = GlobalKey(); @override void initState() { super.initState(); _list = ListModel( listKey: _listKey, initialItems: [], ); getAllQuestions(); } @override void dispose() { _listKey = null; _scrollCtrl.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: AppColors.NewAppbarBgColor, leading: CustomUI.buildCustomLeading(context), title: Text( I18n.of(context).help, textScaleFactor: 1.0, style: TextStyle(color: AppColors.NewAppbarTextColor), ), centerTitle: true, ), body: SafeArea( child: Column( children: [ Expanded( child: GestureDetector( onTap: () { print('隐藏FocusNode'); FocusScope.of(context).requestFocus(FocusNode()); setState(() {}); }, child: _buildMessageList())), _buildTextComposer(), ], )), ); } getAllQuestions() async { Map data = { "language": UserData().language, }; data['sign'] = TokenMgr().getSign(data); Response res = await HttpUtil().post('message/staff/question', data: data); var resData = res.data; if (resData['code'] == 0) { questions = resData['data'] .map((v) => QuestionModel.fromJson(v)) .toList(); String userName; if (UserData().isMan()) { userName = I18n.of(context).man_vi; } else { userName = I18n.of(context).women_vi; } var allTexts = ['$userName,${I18n.of(context).kf_tips}']; for (var i = 0; i < questions.length; i++) { allTexts.add(questions[i].question); } _list.add(ServiceMsgModel(isMe: false, msg: allTexts)); ///自动发送提问 if (widget.questionIndex != -1) { _textCtrl.text = widget.questionIndex.toString(); sendMessage(); } } } buildQuestions(msg) { if (questions == null) { return Container(); } return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ ClipRRect( child: Image.asset(R.assetsImagesServiceIcon), borderRadius: BorderRadius.circular(8), ), SizedBox(width: 8), Container( width: Screen.width - 120, padding: EdgeInsets.symmetric(vertical: 10, horizontal: 5), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10)), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: msg .map((text) => Container( child: Text(text, textScaleFactor: 1.0, style: TextStyle(fontSize: 13)), )) .toList())) ], ); } getAnswerWith(int index) async { Map data = {"language": UserData().language, "number": index}; data['sign'] = TokenMgr().getSign(data); Response res = await HttpUtil().post('message/staff/answer', data: data); var resData = res.data; if (resData['code'] == 0) { _list.add(ServiceMsgModel(isMe: false, msg: [resData['data']])); } else { print(resData['msg']); } } buildAnswer(msg) { String answer = msg[0]; print('anser a$answer'); String sign = ''; bool isHttp = answer.trim().startsWith('http'); if (isHttp) { answer = I18n.of(context).service_withdraw_tips; Map data = { "userId": UserData().basicInfo.userId, "language": UserData().language, }; sign = TokenMgr().getSign(data); print( '@@@@@@ sign $sign ${UserData().basicInfo.userId} ${UserData().language}'); } return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ ClipRRect( child: Image.asset(R.assetsImagesServiceIcon), borderRadius: BorderRadius.circular(8), ), SizedBox(width: 8), Container( width: Screen.width - 120, padding: EdgeInsets.symmetric(vertical: 10, horizontal: 5), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10)), child: isHttp ? Container( child: Column( children: [ Text(answer, textScaleFactor: 1.0, style: TextStyle(fontSize: 13)), SizedBox( height: 6, ), GestureDetector( child: Text(I18n.of(context).withdraw_tips, textScaleFactor: 1.0, style: TextStyle(fontSize: 13, color: Colors.blue)), onTap: () async { String url = msg[0] + '/Bank/Getlanguage?userId=${UserData().basicInfo.userId}&language=${UserData().language}&sign=$sign'; print('url :$url'); await launch(url); }, ), ], ), ) : Container( child: Text(msg[0], textScaleFactor: 1.0, style: TextStyle(fontSize: 13)), )) ], ); } _buildMessageList() { return AnimatedList( key: _listKey, initialItemCount: _list.length, controller: _scrollCtrl, padding: EdgeInsets.symmetric(horizontal: 8, vertical: 10), itemBuilder: _buildItem, ); } Widget _buildItem( BuildContext context, int index, Animation animation) { ServiceMsgModel msg = _list[index]; Widget item; if (index == 0) { item = buildQuestions(msg.msg); } else { if (msg.isMe) { item = buildSendMsg(msg.msg.first); } else { item = buildAnswer(msg.msg); } } return SizeTransition( sizeFactor: CurvedAnimation(parent: animation, curve: Curves.decelerate), axisAlignment: -2, child: Padding(padding: EdgeInsets.only(bottom: 10), child: item)); } Future _textMessageSubmitted(String text) async { sendMessage(); } buildSendMsg(msg) { return Row( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( constraints: BoxConstraints(maxWidth: Screen.width - 120), child: Text(msg, textScaleFactor: 1.0, style: TextStyle(color: Colors.white)), padding: EdgeInsets.symmetric(horizontal: 15, vertical: 12), decoration: BoxDecoration( boxShadow: [ BoxShadow( color: Colors.blue[200], offset: Offset(0, 2), blurRadius: 3.0), ], color: Color(0xFF377dfe), borderRadius: BorderRadius.only( bottomLeft: Radius.circular(15), topLeft: Radius.circular(15), bottomRight: Radius.circular(15), )), ), SizedBox(width: 5), Container( width: 40, height: 40, child: ClipRRect( borderRadius: BorderRadius.circular(8), child: CachedNetworkImage( imageUrl: UserData().basicInfo.headimgurl, placeholder: (context, url) => Image.asset(R.assetsImagesDefaultNorAvatar), ))), ], ); } sendMessage() { var text = _textCtrl.text; if (text.length > 0) { int index = int.parse(text); if (index > 0 && index <= questions.length) { _list.add(ServiceMsgModel(isMe: true, msg: [text])); getAnswerWith(index); _textCtrl.clear(); } else { showToast(I18n.of(context).reinput); } } } _buildTextComposer() { return Container( alignment: Alignment.center, width: Screen.width, child: Row( children: [ Expanded( child: Container( child: TextField( keyboardAppearance: Brightness.light, onSubmitted: _textMessageSubmitted, controller: _textCtrl, keyboardType: TextInputType.number, cursorColor: Color.fromARGB(255, 0, 189, 96), style: TextStyle( fontSize: fixedFontSize(15), textBaseline: TextBaseline.alphabetic), ), decoration: BoxDecoration( color: Colors.grey[200], borderRadius: BorderRadius.circular(10), ), ), ), SizedBox(width: 5), SizedBox( child: OutlineButton( child: Text(I18n.of(context).send, textScaleFactor: 1.0), onPressed: sendMessage, )) ], ), padding: EdgeInsets.symmetric(horizontal: 10, vertical: 8), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( topLeft: Radius.circular(8), topRight: Radius.circular(8)), ), ); } }