Flutter实战一Flutter聊天应用(十九)
在上一篇文章中,我们完成了聊天列表的用户界面与功能代码。在用户添加完会话后,聊天列表会增加对应的会话项,通过点击会话项,可以进入聊天屏幕。在这一篇文章中,我们主要是修改 首先打开 class ChatScreen extends StatefulWidget {
ChatScreen(
{this.messages,this.myName,this.sheName,this.myPhone,this.shePhone});
final String messages;
final String myName;
final String sheName;
final String myPhone;
final String shePhone;
@override
State createState() => new ChatScreenState(messages);
}
接下来在 class ChatScreenState extends State<ChatScreen> {
ChatScreenState(this._messages);
final String _messages;
static final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
final TextEditingController _textController = new TextEditingController();
final chatsReference = FirebaseDatabase.instance.reference().child('chats');
final messagesReference = FirebaseDatabase.instance.reference().child('messages');
bool _isComposing = false;
//...
}
我们再修改一下 class ChatScreenState extends State<ChatScreen> {
//...
void _sendMessage({String text,String imageUrl}) {
String time = new DateTime.now().toString();
messagesReference.child(_messages).push().set({
'text': text,'imageUrl': imageUrl,'senderName': widget.myName,'timestamp': time
});
chatsReference
.child('${widget.shePhone}/${widget.myPhone}/lastMessage')
.set(text);
chatsReference
.child('${widget.shePhone}/${widget.myPhone}/timestamp')
.set(time);
chatsReference
.child('${widget.myPhone}/${widget.shePhone}/lastMessage')
.set(text);
chatsReference
.child('${widget.myPhone}/${widget.shePhone}/timestamp')
.set(time);
}
//...
}
在聊天屏幕的右上方,我们需要增加一个弹出菜单,使用 class ChatScreenState extends State<ChatScreen> {
//...
@override
Widget build(BuildContext context) {
return new Scaffold(
key: _scaffoldKey,appBar: new AppBar(
title: new Text(widget.sheName),centerTitle: true,elevation: 1.0,actions: <Widget>[
new PopupMenuButton<String>(
onSelected: (String value) {
if (value == "delete") {
chatsReference
.child('${widget.shePhone}/${widget.myPhone}/activate')
.set("false");
chatsReference
.child('${widget.myPhone}/${widget.shePhone}/activate')
.set("false");
_scaffoldKey.currentState.showSnackBar(new SnackBar(
content: new Text("删除成功!"),));
}
},itemBuilder: (BuildContext context) => <PopupMenuItem<String>>[
new PopupMenuItem<String>(
value: "delete",child: new Text('删除会话')),])
]),body: new Stack(children: <Widget>[
//...
]),);
}
}
当会话已经被被设置为无效状态时,应用程序不会自动返回到聊天列表屏幕,因此当用户再次发送消息时,我们应该提示用户该会话已经被删除。修改一下 class ChatScreenState extends State<ChatScreen> {
//...
Future _handleSubmitted(String text) async {
chatsReference
.child('${widget.myPhone}/${widget.shePhone}/activate')
.onValue
.listen((Event event) {
if (event.snapshot.value == "false") {
_scaffoldKey.currentState.showSnackBar(new SnackBar(
content: new Text("会话已经被删除了哦!"),));
} else {
if (text.trim() == "") return;
_textController.clear();
_isComposing = false;
_sendMessage(text: text);
}
});
}
//...
}
关于聊天屏幕的更多样式修改,可以查看chat_screen.dart文件了解详情。现在我们打开 class _GroupChatListBodyState extends State<GroupChatListBody> {
//...
@override
Widget build(BuildContext context) {
return new FirebaseAnimatedList(
//...
itemBuilder: (BuildContext context,DataSnapshot snapshot,Animation<double> animation) {
return new SizeTransition(
sizeFactor: animation,child: snapshot.value["activate"] == "false"
? null
: new GroupChatListBodyItem(
//...
),);
},);
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |