在上一篇文章《Flutter实战一Flutter聊天应用(十九)》中,我们完成了删除用户的逻辑,就是将会话的有效性设置为false就可以了。那么当会话的有效性为false时,用户再次添加该会话,我们应该怎么处理呢?

打开add_session.dart文件,将_AddSessionState_addSession方法中将新会话写入数据库的代码提取出来。同时,在_AddSessionState中新增一个_writeNewSession方法,将之前提取的数据库操作代码放在_writeNewSession方法中。

class _AddSessionState extends State<AddSession> {//...void _writeNewSession(String time, String message) {chatsReference.child('$_myPhone/$_searchPhone').set({"name": _searchUsername,"phone": _searchPhone,"messages": "$_myPhone$_searchPhone$message","lastMessage": "一起来聊天吧!","timestamp": time,"activate": "true"});chatsReference.child('$_searchPhone/$_myPhone').set({"name": widget.myName,"phone": _myPhone,"messages": "$_myPhone$_searchPhone$message","lastMessage": "一起来聊天吧!","timestamp": time,"activate": "true"});}//...
}

然后再修改_AddSessionState_addSession方法,如果和查找到的用户已经存在过会话,判断该会话的有效性是true还是false。结果为false则执行上面添加的_writeNewSession方法,这样就会为双方增加一个新的聊天记录,同时也会将前一个会话的聊天记录移除。

class _AddSessionState extends State<AddSession> {//...Future<int> _addSession() async {String time = new DateTime.now().toString();int random = new Random().nextInt(100000);String message = time.split(' ')[0].replaceAll('-', '') + random.toString();return await chatsReference.child('$_myPhone/$_searchPhone').once().then((DataSnapshot onValue) {if (onValue.value == null) {_writeNewSession(time, message);return 1;} else {if (onValue.value["activate"] == "true") {return 0;} else {_writeNewSession(time, message);return 2;}}});}//...
}

如果上面的结果为true时,说明该会话当前已经在用户的聊天列表中,那么我们应该直接跳转到对应的聊天屏幕中去。添加屏幕的入口是在_GroupChatListState中,所在现在我们打开group_chat_list.dart文件,修改_GroupChatListState_floatingButtonCallback方法。

//...
import 'chat_screen.dart';
//...
class _GroupChatListState extends State<GroupChatList> {//...void _floatingButtonCallback() {showDialog<List<String>>(context: context,barrierDismissible: false,child: new AddSession(phone, name)).then((List<String> onValue) {if (onValue != null) {Navigator.of(context).push(new MaterialPageRoute<Null>(builder: (BuildContext context) {return new ChatScreen(messages: onValue[2],myName: name,sheName: onValue[0],myPhone: phone,shePhone: onValue[1]);},));}});}//...
}

在上面代码中,我们将添加屏幕的返回值设置成List<String>,当查找到已经存在于聊天列表的会话时,添加屏幕会返回一个包含对方姓名、手机和聊天记录的字符串列表。根据返回的信息,我们可以创建一个ChatScreen控件,也就是聊天屏幕。现在回到add_session.dart文件中,修改_AddSessionState_addSession方法。

//...
class _AddSessionState extends State<AddSession> {//...String _searchMessages = "";//...Future<int> _addSession() async {//...return await chatsReference.child('$_myPhone/$_searchPhone').once().then((DataSnapshot onValue) {if (onValue.value == null) {_writeNewSession(time, message);return 1;} else {if (onValue.value["activate"] == "true") {_searchMessages = onValue.value["messages"];return 0;} else {_writeNewSession(time, message);return 2;}}});}//...
}

上面添加了一个_searchMessages变量,用于保存查找到的聊天记录,并在返回结果为true时赋值给_searchMessages。然后我们还要修改一下_AddSessionState_handleAppend方法。

class _AddSessionState extends State<AddSession> {//...void _handleAppend() {showDialog<int>(context: context,barrierDismissible: false,child: new ShowAwait(_addSession())).then((int onValue) {if (onValue == 1 || onValue == 2) {Navigator.of(context).pop(null);} else if (onValue == 0) {Navigator.of(context).pop([_searchUsername, _searchPhone, _searchMessages]);}});}//...
}

在上面代码中,当_addSession方法返回12时,直接返回null给上一级屏幕,如果返回值是0,说明是己存在聊天列表的会话,则返回查找到的姓名、手机及聊天记录。配合我们上面修改group_chat_list.dart文件的代码,当查找到己存在聊天列表的会话时,应用程序会自动跳转到对应的聊天屏幕。

上面的图片展示的是当前添加屏幕的错误提示样式,使用的是弹窗提示,可是我们的添加屏幕本身就是以弹出窗口形式打开的,再使用弹窗提示,不就是两层弹窗了。我们需要对错误提示样式进行修改,修改_AddSessionStatebuild方法

class _AddSessionState extends State<AddSession> {//...String _errorPrompt = "";//...@overrideWidget build(BuildContext context) {return new SimpleDialog(title: new Text("添加会话"), children: <Widget>[new Container(//...),_errorPrompt == ""? new Text(""): new Center(child: new Text(_errorPrompt,style: new TextStyle(color: Colors.red),)),_searchUsername == ""? new Text(""): new Container(//...),//...]);}
}

在上面代码中,增加了一个_errorPrompt变量,当该变量不为空时,就会以红色文本的形式显示在输入框与结果显示区中间。我们需要将所有错误提示都替换成修改_errorPrompt变量,例如下面代码。

setState(() {_errorPrompt = "该用户不存在!";_searchUsername = "";
});setState(() {_errorPrompt = "";
});

Flutter实战一Flutter聊天应用(二十)相关推荐

  1. Flutter实战一Flutter聊天应用(十六)

    在上一篇文章<Flutter实战一Flutter聊天应用(十五)>中,我们完成了登陆屏幕.在用户登陆成功后,会在本地创建一个LandingInformation文件,以使应用程序在启动时可 ...

  2. Flutter实战一Flutter聊天应用(十五)

    在上一篇文章<Flutter实战一Flutter聊天应用(十四)>中,我们完成了注册屏幕.为了保持应用程序入口只有一个,即登陆屏幕,用户注册完成之后会返回手机号码.密码到登陆屏幕,让用户点 ...

  3. Flutter实战一Flutter聊天应用(汇总)

    纸聊 这个应用程序使用Google的Flutter移动框架开发,是一个实时聊天应用程序,为了能专注于APP设计,应用程序的服务端使用Googler的Firebase平台.程序程序的名称为纸聊,意为像传 ...

  4. Flutter实战一Flutter聊天应用(二十一)

    在这一系列的前二十篇文章里,我们已经完成了最主要的添加.删除好友,并与好友聊天,还可以发送图片的功能.这一篇文章会完成个人资料与设置相关的功能,并将应用发布上线. 之前设置了个人资料的入口按钮,现在我 ...

  5. Flutter实战一Flutter聊天应用(五)

    我们的应用程序现在已经有了一个好看的UI,但是我们还没有一个后端.所以我们要买一个云服务器,然后再安装数据库?当然不是!我们可以使用Firebase平台作为后端,那么Firebase是什么呢? Fir ...

  6. Flutter实战一Flutter聊天应用(十九)

    在上一篇文章中,我们完成了聊天列表的用户界面与功能代码.在用户添加完会话后,聊天列表会增加对应的会话项,通过点击会话项,可以进入聊天屏幕.在这一篇文章中,我们主要是修改lib/chat_screen. ...

  7. Flutter实战一Flutter聊天应用(十八)

    在上一篇文章中,我们完成了基本的添加聊天功能,但是还没有在聊天列表显示添加的新聊天,在这篇文章中我们将实现这个功能--在聊天列表中展示所有的聊天. 首先,我们在/lib目录下新建一个group_cha ...

  8. Flutter实战一Flutter聊天应用(十)

    首先,我们要修复一下之前几篇文章中存在的缺陷.在发送超过两行的消息时,屏幕上显示的消息不会自动换行,会超出最大宽度.我们可以通过将Text包装在Container控件中,再添加一个width属性,使其 ...

  9. Flutter实战一Flutter聊天应用(二)

    随着项目的代码越来越多,我们会碰到各种问题,所以我们需要学习一下如何使用IntelliJ定位并解决问题.我们可以在IntelliJ IDE上调试在模拟器/仿真器或真机设备上运行的Flutter应用程序 ...

最新文章

  1. OWA登录页面显示为英文而不是中文
  2. c语言中的if语句_If ... C中的其他语句解释
  3. 论文整理集合 -- 吴恩达老师深度学习课程
  4. Javascript中闭包的作用域链
  5. C#中5步完成word文档打印的方法
  6. mysql js 命令行登录_mysqlsh 命令行模式与密码保存-爱可生
  7. Android基础入门教程——9.1 使用SoundPool播放音效(Duang~)
  8. AndroidStudio如何删除Modle
  9. 华为是怎样研发的(4)——器件选型
  10. Python+Selenium自动化测试之页码,前一页、后一页、翻页
  11. 夏天CPU温度过高原因及解决办法
  12. react通过hook实现父组件调用孙子组件方法(非redux)
  13. 2022-2028全球与中国绿色氢基微电网市场现状及未来发展趋势
  14. Python的IDEL增加清屏功能
  15. 读书笔记-干法-热爱工作天道酬勤
  16. Epub 阅读器 - iOS
  17. C语言单片机压力传感器报警器,单片机压力传感器的实时监测和报警程序
  18. USACO 1.1.4Broken Necklace 破碎的项链
  19. 【配置JAVA环境】
  20. 3G上网卡2_编程自动切换模式学习笔记

热门文章

  1. Anaconda——复制Conda的虚拟环境
  2. Oracle JDBC配置
  3. Oracle11g x64使用Oracle SQL Developer报错:Unable to find a Java Virtual Machine
  4. 遗传算法求解旅行商问题
  5. Python3.x连接MySQL数据库,SQL语句使用方法
  6. pytorch1.7.0 安装亲测有效
  7. c语言printf、sprintf、vsprintf用法和区别
  8. X server:linux 图形界面原理
  9. C++继承机制(一)——基本语法、三种继承方式、继承哪些数据
  10. sBRDF空间双向反射分布函数完全解析