提交用户的注册信息

我们现需要将用户的注册信息保存到Firebase实时数据库,在Firebase控制台中,更改Firebase实时数据库的安全规则,选择“Database > 规则”,规则如下所示:

{"rules": {"users":{".read": true,".write": true},"messages": {".read": true,".write": "auth != null && auth.provider == 'google'"}}
}

然后在sign_up.dart文件的SignUpState类中添加_userLogUp方法,代码如下所示:

import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';
//...
class SignUpState extends State<SignUp> {//...final reference = FirebaseDatabase.instance.reference().child('users');//...void _userLogUp(String username, String password, {String email, String phone}){reference.push().set({'name': username,'password': password,'email': email,'phone': phone,});}//...
}

SignUpState类的build方法中修改Join按钮的点击事件,代码如下所示:

class SignUpState extends State<SignUp> {//...@overrideWidget build(BuildContext context) {return new Scaffold(//...new FlatButton(child: new Container(//...child: new Center(child: new Text("Join",style: new TextStyle(color: const Color(0xff000000),))),),onPressed: () {_userLogUp(_usernameController.text, _passwordController.text,email: _emailController.text, phone: _phoneController.text);},),//...
}

现在我们在注册屏幕中点击Join按钮就会提交用户信息到Firebase实时数据库。

检查用户的输入内容

我们现在已经可以上传用户的注册信息,现在需要添加对注册信息的检查功能。在我们的应用程序中,注册信息有以下限制:用户名不能为空且大于等于三位,密码不能为空且大于等于六位。

class SignUpState extends State<SignUp> {//...String _correctUsername = "";String _correctPassword = "";//...
}

首先我们在SignUpState类的添加两个成员变量_correctUsername_correctPassword,存储用户名和密码的错误信息,同时根据它们是否为空来判断用户输入是否符合条件。

class SignUpState extends State<SignUp> {//...new TextField(controller: _usernameController,decoration: new InputDecoration(hintText: 'Username',errorText: (_correctUsername == "")? null: _correctUsername,icon: new Icon(Icons.account_circle,),),onChanged: (String value) {setState(() {if (value.isEmpty) {_correctUsername = "Username cannot be empty";} else if (value.trim().length < 3) {_correctUsername ="Username length is less than 3 bits";} else {_correctUsername = "";}});},),new TextField(controller: _passwordController,obscureText: true,keyboardType: TextInputType.number,decoration: new InputDecoration(hintText: 'Password',errorText: (_correctPassword == "")? null: _correctPassword,icon: new Icon(Icons.lock_outline,),),onChanged: (String value) {setState(() {if (value.isEmpty) {_correctPassword = "Password cannot be empty";} else if (value.trim().length < 6) {_correctPassword ="Password length is less than 6 bits";} else {_correctPassword = "";}});},),//...
}

现在用户输入时应用程序会给予对应的错误提示,我们还需要在用户点击Join按钮时再次检查用户名与密码,如果存在错误则弹出消息提示。弹出消息提示是比较常用的操作之一,因此我们可以单独封装起来,在项目的lib目录下创建一个prompt_page.dart文件,并添加下面的代码:

import 'package:flutter/material.dart';class PromptPage {showMessage(BuildContext context, String text) {showDialog<Null>(context: context,child: new AlertDialog(title: new Text("Alert"),content: new Text(text),actions: <Widget>[new FlatButton(onPressed: () {Navigator.pop(context);},child: const Text('OK'))]));}
}

然后我们回到sign_up.dart文件中来,在SignUpState类中添加PromptPage类型的promptPage成员变量。同时添加成员方法_handleSubmitted用于处理用户点击Join按钮时的操作。

import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';
import 'dart:async';
import 'prompt_page.dart';
//...
class SignUpState extends State<SignUp> {//...PromptPage promptPage = new PromptPage();//...Future _handleSubmitted() async {if (_usernameController.text == '' || _passwordController.text == '') {await promptPage.showMessage(context, "Username or password cannot be empty!");return;} else if (_correctUsername.isNotEmpty || _correctPassword.isNotEmpty) {await promptPage.showMessage(context, "Username or password format is incorrect!");return;}_userLogUp(_usernameController.text, _passwordController.text,email: _emailController.text, phone: _phoneController.text);}//...
}

然后我们需要在SignUpState类的build方法中修改Join按钮的点击事件,代码如下所示:

class SignUpState extends State<SignUp> {//...@overrideWidget build(BuildContext context) {return new Scaffold(//...new FlatButton(child: new Container(//...child: new Center(child: new Text("Join",style: new TextStyle(color: const Color(0xff000000),))),),onPressed: () {_handleSubmitted();},),//...
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 使用Volley传输网络数据
  2. mysql getinstance_php设计模式之单例模式使用示例
  3. windows10如何删除文件时提示?(回收站--右键属性--显示删除确认对话框)
  4. python30行代码_仅利用30行Python代码来展示X算法
  5. 博士申请 | 香港理工大学滕龙老师课题组招收机器人方向博士生/研究助理
  6. JQuery-学习笔记03【基础——DOM操作】
  7. 统计单词个数(划分型)
  8. CANOpen服务数据对象报文
  9. jQuery .tmpl(), .template()学习
  10. Spring 配置文件加载原理
  11. FPGA扩展SRAM
  12. javar -jar 和 java -cp :命令行运行java代码
  13. Android View框架总结(八)ViewGroup事件分发机制
  14. 取得系统当前日期和时间
  15. 实用供热空调设计手册_空调水系统管路设计与施工,全是最实用的现场经验!...
  16. freeswitch SIP信令的接收
  17. 巨头卡位物联网 纷纷瞄准家庭网关设备
  18. 每日一滴——更新pycharm_nltk包中模块的安装
  19. iOS应用程序内存泄露的监测
  20. 初入职场,为人处事(社牛勿看)

热门文章

  1. P4:神经网络与反向传播
  2. Linux中的文件查找技巧
  3. LeetCode Week 6:第 51 ~ 55 题
  4. 【题解】(排序) —— POJ 0811:牛的选举
  5. LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation 论文笔记
  6. 建设城市(city)(【CCF】NOI Online 能力测试2 入门组第三题 )
  7. ~~高精度除以低精度
  8. 人工智能——自动驾驶仿真软件
  9. 数据结构 (二) ----- 单向链表双向链表
  10. 算法不会,尚能饭否之排序——折半插入排序(Binary Insert Sort)