import 'package:e2ee_chat/common/global.dart'; import 'package:e2ee_chat/presenter/session.dart'; import 'package:flutter/material.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:provider/provider.dart'; class SessionList extends StatefulWidget { @override _SessionListState createState() => _SessionListState(); } class _SessionListState extends State { @override Widget build(BuildContext context) { return ChangeNotifierProvider( create: (context) { return SessionListModel(); }, child: Builder( builder: (context) { var provider = Provider.of(context); return ListView.builder( itemCount: provider.count, itemBuilder: (context, index) { var _item = provider.sessions[index]; return Slidable( actionPane: SlidableDrawerActionPane(), actionExtentRatio: 0.25, secondaryActions: [ IconSlideAction( caption: '取消置顶', color: Colors.black45, icon: Icons.more_horiz, onTap: () {}, ), IconSlideAction( caption: '删除', color: Colors.redAccent, icon: Icons.delete, onTap: () => {}, ), ], child: Padding( padding: EdgeInsets.only(left: 36, bottom: 20, top: 20), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded(child: SessionItem(_item)), _item.isStick ? Container( width: 40, height: 48, margin: EdgeInsets.only(top: 10, right: 10), child: Icon(Icons.star)) : Padding( padding: EdgeInsets.symmetric(horizontal: 24), ) ], ), ), ); }); }, ), ); } } class SessionItem extends StatelessWidget { final SessionModel model; SessionItem(this.model); @override Widget build(BuildContext context) { final message = model.lastMessage; return Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ model.avatar ?? Global.defaultAvatar, Expanded( child: Column( children: [ Padding( padding: EdgeInsets.symmetric(vertical: 8), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text( model.chatName, style: TextStyle(fontSize: 34), overflow: TextOverflow.ellipsis, ), ), Text( model.lastMessage != null ? _formatDate(model.lastMessage!.time) : "", style: TextStyle(fontSize: 26), overflow: TextOverflow.ellipsis, ), ], ), ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: RichText( text: TextSpan(children: [ TextSpan( text: model.isAtYou ? "[@你]" : "", style: TextStyle(fontSize: 28), ), TextSpan( text: model.isSpecialAttention ? "[特别关注]" : "", style: TextStyle(fontSize: 28), ), TextSpan( text: model.isAtAll ? "[@所有人]" : "", style: TextStyle(fontSize: 28), ), TextSpan( text: model.lastMessage?.content.target?.plaintext ?? "", style: TextStyle(fontSize: 28), ) ]), overflow: TextOverflow.ellipsis, ), ), (model.unReadCount > 0 && !model.isDND) ? Container( width: 32, height: 32, alignment: Alignment.center, decoration: BoxDecoration(borderRadius: BorderRadius.circular(20)), child: Text( model.unReadCount.toString(), style: TextStyle(color: Colors.white, fontSize: 26), )) : Container(), model.isDND ? Row( children: [ Icon(Icons.visibility_off), model.unReadCount > 0 ? Icon( Icons.chat_bubble, color: Colors.red, ) // TODO: 小红点 : Container() ], ) : Container() ], ) ], ), ) ], ); } String _formatDate(int time) { DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(time); return "${dateTime.hour}:${dateTime.minute}"; } }