Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。
详情请查看
效果图:
实现代码:
/** * Author : wangning * Email : maoning20080809@163.com * Date : 2022/11/8 14:22 * Description : 群列表 */ class GroupMain extends StatefulWidget { @override State<StatefulWidget> createState() => _GroupMainState(); } class _GroupMainState extends State<GroupMain>{ var baseEvent; ScrollController _scrollController = ScrollController(); //listview 的控制器 List<GroupBean> groupList = []; String account = SpUtils.getAccount(); @override void initState() { super.initState(); _getData(); baseEvent = eventBus.on<BaseEvent>((baseBean) { //刷新群聊记录 if(baseEvent != null && baseBean.type == BaseEvent.TYPE_REFRESH_GROUP){ _getData(); } }); } //加载数据 _getData() async { groupList = await GroupRepository.getInstance().findAllGroupByAccount(account)??[]; setState(() { }); } //跳转到群聊页面 _goGroupDetails(String? groupId){ if(groupId == null){ return; } Navigator.pushNamed(context, Routes.group_chat_main, arguments: { "groupId":groupId //参数map }); } @override void dispose() { super.dispose(); eventBus.off(baseEvent); } @override Widget build(BuildContext context) { return Scaffold( appBar: WnAppBar.getAppBar(context, Text("群列表")), body: Column( children: [ Expanded( child:ListView.builder( itemCount: groupList.length, controller: _scrollController, itemBuilder: (context, index) { return InkWell( onLongPress: (){ LogUtils.d("长按。${index}"); }, onTap: (){ _goGroupDetails(groupList[index].groupId); }, child: Container( decoration: BoxDecoration(border: Border(bottom:BorderSide(color: Color(0xffd9d9d9), width: 0.3))), padding: EdgeInsets.only(left: 14, top: 20, bottom: 20), child: Row( children: [ CommonAvatarView.showBaseFileImage(groupList[index].avatar??"", width:44, height:44), SizedBox(width: 12,), Text(groupList[index].groupName??"", maxLines: 1,style: TextStyle(fontSize: 18, color: Colors.black, fontWeight: FontWeight.bold),), ], ), ), ); }) ), Container( margin: EdgeInsets.only(top: 12, bottom: 12), child: Text("${groupList.length}个群聊", style: TextStyle(fontSize: 20, color: Colors.grey),), ), ], ), ); } }