import 'package:chat/data/UserData.dart'; import 'package:chat/data/WebData.dart'; import 'package:chat/data/conversation.dart'; import 'package:chat/generated/i18n.dart'; import 'package:chat/home/InfoList.dart'; import 'package:chat/home/last_chat_record_widget.dart'; import 'package:chat/home/unread_dot_widget.dart'; import 'package:chat/utils/CustomUI.dart'; import 'package:chat/utils/HttpUtil.dart'; import 'package:chat/utils/MessageMgr.dart'; import 'package:chat/utils/TokenMgr.dart'; import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../data/constants.dart' show AppColors, AppStyles, Constants; import 'package:cached_network_image/cached_network_image.dart'; class _ConversationItem extends StatelessWidget { const _ConversationItem( {Key key, this.conversation, this.callback, this.icon, this.bgColor, this.iconSize = 20}) : assert(conversation != null), super(key: key); final icon; final double iconSize; final Conversation conversation; final callback; final bgColor; @override Widget build(BuildContext context) { Widget avatar; if (icon != null) { avatar = Container( height: 47.5, width: 47.5, margin: EdgeInsets.only(left: 6), alignment: Alignment.center, decoration: BoxDecoration( gradient: bgColor, borderRadius: BorderRadius.all(Radius.circular(50))), child: Image.asset( icon, height: iconSize, )); } else if (conversation.isAvatarFromNet()) { avatar = CachedNetworkImage( imageUrl: conversation.avatar, placeholder: CustomUI.buildImgLoding, width: Constants.ConversationAvatarSize, height: Constants.ConversationAvatarSize, ); } else { avatar = Image.asset( conversation.avatar, width: Constants.ConversationAvatarSize, height: Constants.ConversationAvatarSize, ); } List _rightArea = [ Container( padding: EdgeInsets.only(top: 4), alignment: Alignment.center, child: Text(conversation.updateAt, textScaleFactor: 1.0, style: TextStyle(fontSize: 11, color: const Color(0xFFC6C6C6))), ) ]; if (conversation.unreadMsgCount > 0) { var countStr = conversation.unreadMsgCount.toString(); if (conversation.unreadMsgCount > 99) { countStr = '99+'; } // 未读消息角标 Widget unreadMsgCountText = Container( width: Constants.UnReadMsgNotifyDotSize, height: Constants.UnReadMsgNotifyDotSize, alignment: Alignment.center, decoration: BoxDecoration( borderRadius: BorderRadius.circular(Constants.UnReadMsgNotifyDotSize / 2.0), color: Color(0xFFFF5454), ), child: Text(countStr, textScaleFactor: 1.0, style: AppStyles.UnreadMsgCountDotStyle), ); _rightArea.add(Expanded( child: Align( alignment: Alignment.bottomCenter, child: unreadMsgCountText, ))); } return InkWell( child: Container( padding: const EdgeInsets.all(10.0), decoration: BoxDecoration( color: Color(AppColors.ConversationItemBgColor), ), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ avatar, Container(width: 17.0), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(conversation.title, textScaleFactor: 1.0, style: TextStyle( color: Colors.black, )), SizedBox( height: 5, ), Text(conversation.desc, textScaleFactor: 1.0, style: TextStyle( fontSize: 12, color: const Color(0xFF9B9B9B))) ], ), ), // Container(width: 10.0), SizedBox( height: Constants.ConversationAvatarSize, child: Column( crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.start, children: _rightArea, ), ) ], ), ), onTap: () { callback(); }, ); } } class ConversActionPage extends StatefulWidget { ConversActionPage({Key key}) : super(key: key); _ConversActionPageState createState() => _ConversActionPageState(); } Map systemInfo = { 'applyList': null, 'applyCount': 0, 'evaluateList': null, 'evaluateCount': 0, 'parkList': null, 'parkCount': 0, 'castList': null, 'castCount': 0, 'walletList': null, 'walletCount': 0, }; int msgNum = 0; bool isShowMsg() { return msgNum > 0; } getAllResNum(prefs) { getResNum(prefs, Constants.ApplyCount); getResNum(prefs, Constants.EvaluateCount); getResNum(prefs, Constants.ParkCount); getResNum(prefs, Constants.CastCount); getResNum(prefs, Constants.WalletCount); } getResNum(prefs, url) async { var count = prefs.getInt(url + UserData().basicInfo.userId.toString()); systemInfo[url] = count == null ? systemInfo[url] : (systemInfo[url] - count); msgNum += systemInfo[url]; } setResNum(url) async { var localKey = url + UserData().basicInfo.userId.toString(); if (systemInfo[url] > 0) { SharedPreferences prefs = await SharedPreferences.getInstance(); var count = prefs.getInt(localKey); prefs.setInt( localKey, count == null ? systemInfo[url] : (systemInfo[url] + count)); msgNum -= systemInfo[url]; systemInfo[url] = 0; } } class _ConversActionPageState extends State with SingleTickerProviderStateMixin { TabController tabCtrl; void getSystemMsg(data) async { Map data = { "userId": UserData().basicInfo.userId, "type": UserData().basicInfo.sex }; data['sign'] = TokenMgr().getSign(data); Response res = await HttpUtil().post('message/all/message', data: data); if (res == null) { return; } Map resData = res.data; if (resData['code'] == 0) { SharedPreferences prefs = await SharedPreferences.getInstance(); systemInfo = resData['data']; msgNum = 0; getAllResNum(prefs); if (mounted) { setState(() {}); } } } @override void initState() { super.initState(); MessageMgr().on('update_system', getSystemMsg); getSystemMsg(null); tabCtrl = TabController(length: 2, vsync: this); } @override void dispose() { tabCtrl.dispose(); MessageMgr().off('update_system', getSystemMsg); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: AppBar( //backgroundColor: Constants.LightGreyBackgroundColor, centerTitle: false, title: Text( I18n.of(context).message_center, textScaleFactor: 1.0, style: Constants.MainTitleStyle, ), actions: [ Container( child: IconButton( icon: CircleAvatar( backgroundColor: Constants.GreyBackgroundColor, radius: 13.75, child: Padding( padding: EdgeInsets.only(bottom: 1.5), child: Icon( IconData(0xe659, fontFamily: Constants.IconFontFamily), color: Constants.BlackTextColor, size: 21, ))), onPressed: () { CustomUI().goScanPage(context); }, ), ), // InkWell( // onTap: () { // Navigator.of(context).push( // new MaterialPageRoute( // builder: (context) { // return MessagePushPage(); // }, // ), // ); // }, // child: Padding( // padding: EdgeInsets.only(right: 10), // child: CircleAvatar( // backgroundColor: Constants.GreyBackgroundColor, // radius: 13.75, // child: Icon( // Icons.settings, // color: Constants.BlackTextColor, // size: 22, // )), // )), ], elevation: 0, bottom: PreferredSize( preferredSize: Size.fromHeight(28), child: Container( padding: EdgeInsets.only(left: 2), decoration: BoxDecoration( //color: Constants.LightGreyBackgroundColor, border: Border(bottom: BorderSide(color: Color(0xffeaeaea)))), alignment: Alignment.centerLeft, child: TabBar( isScrollable: true, indicatorPadding: EdgeInsets.only(left: 9, right: 9), tabs: [ UnreadDot( child: Container( margin: EdgeInsets.only(right: 4), child: Text(I18n.of(context).text_chat, textScaleFactor: 1.0), ), type: 1), UnreadDot( child: Container( margin: EdgeInsets.only(right: 4), child: Text(I18n.of(context).system_information, textScaleFactor: 1.0)), type: 2), ], controller: tabCtrl, ), )), ), body: SafeArea( child: TabBarView( children: [ LastChatPage(), ListView( children: [ SizedBox(height: 8.5), _ConversationItem( icon: 'assets/images/chat/icon1.png', bgColor: Constants.RadioGradient, conversation: Conversation( avatar: 'assets/images/ic_tx_news.png', title: I18n.of(context).radio_message, desc: RichTitle.normalTitle( systemInfo['castList'], context, InfoType.Radio), updateAt: systemInfo['castList'] == null ? "" : WebData().getLoginTime( context, systemInfo['castList']['CreateTime']), unreadMsgCount: systemInfo['castCount'], ), callback: () { setResNum(Constants.CastCount); Navigator.of(context).push( new MaterialPageRoute( builder: (context) { return InfoListPage( title: I18n.of(context).radio_message, type: InfoType.Radio, ); }, ), ); }, ), _ConversationItem( icon: 'assets/images/chat/icon4.png', bgColor: Constants.MoneyGradient, conversation: Conversation( avatar: 'assets/images/ic_tx_news.png', title: I18n.of(context).wallet_reminder, desc: RichTitle.normalTitle( systemInfo['walletList'], context, InfoType.Money), updateAt: systemInfo['walletList'] == null ? "" : WebData().getLoginTime( context, systemInfo['walletList']['CreateTime']), unreadMsgCount: systemInfo['walletCount'], ), callback: () { setResNum(Constants.WalletCount); Navigator.of(context).push( new MaterialPageRoute( builder: (context) { return InfoListPage( title: I18n.of(context).wallet_reminder, type: InfoType.Money, ); }, ), ); }, ), _ConversationItem( icon: 'assets/images/chat/icon3.png', iconSize: 27, bgColor: Constants.ApplyGradient, conversation: Conversation( avatar: 'assets/images/ic_tx_news.png', title: I18n.of(context).application_notice, desc: RichTitle.normalTitle( systemInfo['applyList'], context, InfoType.Apply), updateAt: systemInfo['applyList'] == null ? "" : WebData().getLoginTime( context, systemInfo['applyList']['CreatTime']), unreadMsgCount: systemInfo['applyCount'], ), callback: () { setResNum(Constants.ApplyCount); Navigator.of(context).push( new MaterialPageRoute( builder: (context) { return InfoListPage( title: I18n.of(context).application_notice, type: InfoType.Apply, ); }, ), ); }, ), _ConversationItem( icon: 'assets/images/chat/icon6.png', bgColor: Constants.EvaGradient, conversation: Conversation( avatar: 'assets/images/ic_tx_news.png', title: I18n.of(context).evaluation_notice, desc: RichTitle.normalTitle(systemInfo['evaluateList'], context, InfoType.Evaluation), updateAt: systemInfo['evaluateList'] == null ? '' : WebData().getLoginTime( context, systemInfo['evaluateList']['CreateTime']), unreadMsgCount: systemInfo['evaluateCount'], ), callback: () { setResNum(Constants.EvaluateCount); Navigator.of(context).push( new MaterialPageRoute( builder: (context) { return InfoListPage( title: I18n.of(context).evaluation_notice, type: 2, ); }, ), ); }, ), _ConversationItem( icon: 'assets/images/chat/icon5.png', bgColor: Constants.ParkGradient, conversation: Conversation( avatar: 'assets/images/ic_tx_news.png', title: I18n.of(context).appName, desc: RichTitle.normalTitle( systemInfo['parkList'], context, InfoType.System), updateAt: systemInfo['parkList'] == null ? "" : WebData().getLoginTime( context, systemInfo['parkList']['CreateTime']), unreadMsgCount: systemInfo['parkCount'], ), callback: () { setResNum(Constants.ParkCount); Navigator.of(context).push( new MaterialPageRoute( builder: (context) { return InfoListPage( title: I18n.of(context).appName, type: InfoType.System, ); }, ), ); }, ) ], ) ], controller: tabCtrl, ))); } }