import 'dart:async'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/im/database/message.dart'; import 'package:huixiang/main.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/msg_stats.dart'; import 'package:huixiang/retrofit/data/page.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/classic_header.dart'; import 'package:huixiang/view_widget/my_footer.dart'; import 'package:huixiang/view_widget/round_button.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'on_chat_message.dart'; import 'on_chat_msg_instance.dart'; class IMPage extends StatefulWidget { IMPage(Key key) : super(key: key); @override State createState() { return _IMPage(); } } class _IMPage extends State implements OnChatMessage { ApiService apiService; int pageNum = 1; List messages = []; Map msgNumber = { "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "6": 0, }; int state = 0; final TextEditingController imEditingController = TextEditingController(); @override void onMessage(txt) { // SmartDialog.showToast("列表 $txt", alignment: Alignment.center); } @override void dispose() { super.dispose(); OnChatMsgInstance.instance.onChatMessage = null; } @override void initState() { super.initState(); OnChatMsgInstance.instance.onChatMessage = this; loadMessageList(); SharedPreferences.getInstance().then((value) { apiService = ApiService(Dio(), token: value.getString("token"), context: context); queryMsgStats(); }); } _refresh() { pageNum = 1; loadMessageList(); queryMsgStats(); } List userIds = []; Stream streamSubscription ; loadMessageList() async { int userId = 123456; hxDatabase.changeListener.stream.listen((event) { debugPrint("messages: 1111"); }, onError: (Object error, stackTrace) { debugPrint("messages: 3333"); }); hxDatabase.changeListener.onListen = () { debugPrint("messages: 2222"); }; messages = await hxDatabase.messageDao.findMessageByGroup(userId); messages.forEach((element) { debugPrint("messages: $element"); }); userIds = messages .map((e) => e.toId != userId ? e.toId : e.fromId) .toSet() .toList(); if (mounted) { setState(() {}); } } // queryMessage() async { // BaseData> baseData = await apiService.msgList({ // "pageNum": pageNum, // "pageSize": 10, // "searchKey": "", // "state": "", // "typed": "" // }).catchError((onError) { // _refreshController.loadFailed(); // _refreshController.refreshFailed(); // }); // // if (baseData != null && baseData.isSuccess) { // if (pageNum == 1) { // messages.clear(); // } // List message = []; // message.addAll(baseData.data.list); // message.forEach((element) { // if (element.typed == 2 || element.typed == 3) { // messages.add(element); // } // }); // _refreshController.loadComplete(); // _refreshController.refreshCompleted(); // if (mounted) setState(() {}); // if (pageNum * 10 > int.tryParse(baseData.data.total)) { // _refreshController.loadNoData(); // } else { // pageNum += 1; // } // } else { // _refreshController.loadFailed(); // _refreshController.refreshFailed(); // } // } queryMsgStats() async { if (apiService == null) { SharedPreferences value = await SharedPreferences.getInstance(); apiService = ApiService( Dio(), context: context, token: value.getString("token"), ); } BaseData> baseData = await apiService.stats().catchError((onError) {}); if (baseData != null && baseData.isSuccess) { setState(() { msgNumber.forEach((key, value) { msgNumber[key] = 0; }); baseData.data.forEach((element) { if (msgNumber.containsKey(element.name)) { msgNumber[element.name] = element.number; } }); }); _refreshController.loadComplete(); _refreshController.refreshCompleted(); } EasyLoading.dismiss(); } RefreshController _refreshController = RefreshController(); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Color(0xFFFFFFFF), body: SmartRefresher( enablePullDown: true, enablePullUp: false, header: MyHeader(), physics: BouncingScrollPhysics(), footer: CustomFooter( loadStyle: LoadStyle.ShowWhenLoading, builder: (BuildContext context, LoadStatus mode) { return (messages.length == 0) ? Container() : MyFooter(mode); }, ), controller: _refreshController, onRefresh: _refresh, onLoading: () { setState(() { _refresh(); }); }, child: Container( // color: Colors.white, decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Color(0xFFD9FFDE), Color(0xFFD9FFDE), Color(0xFFFFFFFF), Color(0xFFFFFFFF), ], stops: [0, 0.2, 0.4, 1], ), ), child: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Container( padding: EdgeInsets.only(bottom: 30.h), child: Column( children: [ Container( padding: EdgeInsets.only( top: MediaQuery.of(context).padding.top + 12.h, bottom: 15.h, right: 16.w, left: 16.w), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ Expanded( child: Text( S.of(context).xiaoxi, style: TextStyle( color: Colors.black, fontSize: 18.sp, fontWeight: MyFontWeight.bold, ), ), ), GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { Navigator.of(context) .pushNamed('/router/chat_friend_group'); }, child: Container( padding: EdgeInsets.all(12), decoration: BoxDecoration( color: Color(0xFFFFFFFF), borderRadius: BorderRadius.circular(20.r), ), child: Image.asset( "assets/image/friend_grouping.webp", fit: BoxFit.fill, height: 14.h, width: 14.h, ), ), ), ], ), ), imSearchItem(), chatList(), // buildMessage(),fgg ], ), ), ), ), ), ); } ///搜索 Widget imSearchItem() { return Container( margin: EdgeInsets.fromLTRB(16.w, 0, 16.w, 0), padding: EdgeInsets.symmetric(vertical: 13.h), decoration: BoxDecoration( color: Color(0xFFFFFFFF), borderRadius: BorderRadius.circular(4), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ), ], ), child: TextField( textInputAction: TextInputAction.search, onEditingComplete: () { socketClient.sendMessage(654321, "hello~"); FocusScope.of(context).requestFocus(FocusNode()); }, controller: imEditingController, style: TextStyle( fontSize: 14.sp, ), decoration: InputDecoration( hintText: "搜索", hintStyle: TextStyle( fontSize: 14.sp, color: Color(0xFFA29E9E), ), isCollapsed: true, prefixIcon: Padding( padding: EdgeInsets.only(left: 15.w, right: 5.w), child: Image.asset( "assets/image/icon_search.webp", width: 14.h, height: 14.h, color: Color(0xFF353535), ), ), prefixIconConstraints: BoxConstraints(), border: InputBorder.none, ), ), ); } ///聊天列表 Widget chatList() { return Container( child: ListView.builder( padding: EdgeInsets.only(top: 16), itemCount: userIds.length, shrinkWrap: true, physics: NeverScrollableScrollPhysics(), itemBuilder: (context, position) { return GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { Navigator.of(context).pushNamed('/router/chat_details_page'); }, child: chatItem(userIds[position]), ); }, ), ); } Widget chatItem(userId) { return Container( padding: EdgeInsets.only(left: 16.w, right: 17.w, bottom: 18.h), child: Row( children: [ // MImage( // "", // isCircle: true, // width: 40, // height: 40, // fit: BoxFit.cover, // errorSrc: "assets/image/default_user.webp", // fadeSrc: "assets/image/default_user.webp", // ), Image.asset( "assets/image/fuka_zj.webp", height: 54.h, width: 54.h, ), SizedBox( width: 12.w, ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: Text( "喽哈$userId", overflow: TextOverflow.ellipsis, maxLines: 1, style: TextStyle( fontSize: 16.sp, color: Color(0xFF060606), fontWeight: MyFontWeight.semi_bold, ), ), ), Text( "2021.03.08 13:22", style: TextStyle( fontSize: 12.sp, color: Color(0xFFA29E9E), fontWeight: MyFontWeight.regular, ), ), ], ), SizedBox( height: 7.h, ), Row( children: [ Expanded( child: Text( "新开的火锅店好吃得很", maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 12.sp, color: Color(0xFF353535), fontWeight: MyFontWeight.regular, ), ), ), Container( width: 16, height: 16, decoration: BoxDecoration( borderRadius: BorderRadius.circular(100), color: Color(0xFFFF441A), ), child: RoundButton( text: "99", textColor: Colors.white, fontWeight: MyFontWeight.regular, backgroup: Color(0xFFFF441A), fontSize: 10.sp, radius: 100, ), ), ], ), ], ), ), ], ), ); } }