前言

目前我们已经实现了几个界面,今天这篇文章开始着手进行登录页的制作,主要流程就是获取输入框中的内容,发送给后台进行验证,如果成功将返回信息保存在本地并跳转至首页,如果失败就提示用户重新输入。 在这里面需要掌握3块知识,第一是flutter中的表单组件的使用,然后则是flutter中的数据存储,最后是网络请求。

效果

代码

上述三个部分我已经在其他文章中分别介绍了,详情点击相关文章的链接

  1. 《flutter表单组件》
  2. 《Flutter数据存储之shared_preferences》
  3. 《利用Flutter写一个跨平台的果核APP(3)——网络请求》

剩下的我就直接放出首页代码了:

import 'package:flutter/material.dart';
import 'package:flutter_guohe/constant//UrlConstant.dart';
import 'package:dio/dio.dart';
import 'package:flutter_guohe/views/customview.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:flutter_guohe/constant/SpConstant.dart';
import 'package:flutter_guohe/pages/app.dart';class LoginPage extends StatefulWidget {static String tag = 'login-page';@override_LoginPageState createState() => new _LoginPageState();
}class _LoginPageState extends State<LoginPage> {GlobalKey<FormState> _formKey = new GlobalKey<FormState>();String _account;String _password;//表单验证方法void _forSubmitted(BuildContext context) {var _form = _formKey.currentState;if (_form.validate()) {_form.save();login(context, _account.trim(), _password.trim());}}//登录void login(BuildContext context, String account, String password) {showDialog(context: context,builder: (context) {return new LoadingDialog(content: "登录中,请稍后......");});FormData formData =new FormData.from({"username": account, "password": password});Dio().post(Constant.STU_INFO, data: formData).then((res) {print(account + " " + password);if (res.statusCode == 200) {Navigator.pop(context);if (res.data['code'] == 200) {print(res.data);String name = res.data['info']['name'];String academy = res.data['info']['academy'];String major = res.data['info']['major'];String stu_id = res.data['info']['name'];String stu_pass = res.data['info']['password'];List<String> list = new List();list.add(name);list.add(academy);list.add(major);list.add(stu_id);list.add(stu_pass);store(list);Navigator.push(context,new MaterialPageRoute(builder: (context) => new Guohe()),);}}});}//将学生的相关信息保存至本地void store(List<String> list) async {SharedPreferences sharedPreferences = await SharedPreferences.getInstance();sharedPreferences.setBool(SpConstant.IS_LOGIN, true);sharedPreferences.setStringList(SpConstant.STU_INFO, list);}@overrideWidget build(BuildContext context) {final account = new TextFormField(autofocus: true,initialValue: '',decoration: new InputDecoration(labelText: '学号',),onSaved: (val) {_account = val;},);final password = new TextFormField(initialValue: '',obscureText: true,decoration: new InputDecoration(labelText: '密码',),onSaved: (val) {_password = val;},);final loginButton = new FloatingActionButton(backgroundColor: Colors.white,foregroundColor: Colors.black26,child: const Icon(Icons.arrow_forward),elevation: 18.0,onPressed: () => _forSubmitted(context),);final loginBox = new Container(width: 320.0,height: 250.0,margin: new EdgeInsets.only(top: 300.0, right: 30.0),child: new Stack(children: <Widget>[new Container(color: Colors.white,width: 280.0,height: 220.0,child: new Form(key: _formKey,child: new ListView(shrinkWrap: true,padding: new EdgeInsets.only(left: 24.0, right: 24.0),children: <Widget>[SizedBox(height: 48.0),account,new SizedBox(height: 15.0,),password,],),)),new Positioned(//方法二right: 15.0,top: 180.0,child: loginButton),],),);return new Scaffold(backgroundColor: Colors.white,body: new Container(decoration: new BoxDecoration(image: new DecorationImage(image: new AssetImage('assets/imgs/bg_login.webp'),fit: BoxFit.cover)),child: new Center(child: loginBox),),);}
}复制代码

利用Flutter写一个跨平台的果核APP(4)——数据存储相关推荐

  1. 利用Flutter写一个跨平台的果核APP(0)——介绍

    前言 今年2月的时候,Google在开发者大会上推出了flutter的第一个预览版,我是在3月左右的时候才了解到这个全新的跨平台框架,并在阅读了相关文档之后写了一篇<你好,Flutter> ...

  2. 利用Flutter写一个跨平台的果核APP(1)——界面篇1

    前言 从这里开始,我就准备边学边做边用博客记录下自己的重构历程,会结合已有的app的样式进行重构. 原图 先看一下app的截图: 上面两个截图是app的首页和左侧菜单栏的截图,首页下方是一个可以滑动的 ...

  3. 利用Flutter写一个跨平台的果核APP(3)——网络请求

    前言 紧接上文界面篇,上文中在构建布局的时候因为是直接将文字图片显示出来的,所以消息类Message,和日知录类One都是采用的无状态的StatelessWidget类,这次我们需要调用接口,然后将返 ...

  4. 用 Flutter 写一个精美的登录页面(最新版)

    用 Flutter 写一个精美的登录页面(最新版) 主体结构 标题 输入框 登录按钮 其他登录方式 注册按钮 完整源码 参考了博客:用flutter写一个精美的登录页面.但是那篇文章是 18 年的,较 ...

  5. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  6. 利用python写一个简单的双色球彩票系统

    利用python写一个简单的双色球彩票系统 1.设置每次买的号码一样 写一个双色球彩票系统,系统可以随机产生一组数据,一组彩票数据有六位数,这六位数的的取值范围是0和1. 一张彩票是两块钱,用户可以选 ...

  7. python抽奖游戏_利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    原标题:利用Python写一个抽奖程序,解密游戏内抽奖的秘密 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客 ...

  8. 利用Cocos2d-x写一个程序读取传奇wzl文件

    Cocos2d-x是一个用于游戏开发的开源框架,它提供了用于制作2D游戏的工具和功能.若要利用Cocos2d-x读取传奇wzl文件,需要对wzl文件的格式进行分析,并使用Cocos2d-x提供的读取文 ...

  9. 利用itchat写一个聊天机器人

    利用itchat写一个聊天机器人 聊天机器人 图灵机器人 需要的库 **自动回复私聊消息** **自动回复群聊消息** 结语: 聊天机器人 偶然在CSDN上看到大佬用20行教你写一个聊天机器人,觉得甚 ...

最新文章

  1. MIT人工突触芯片新突破:指甲大小的芯片有望媲美超算
  2. 网络流题目详讲+题单(提高版)(持续更新中......)
  3. LeetCode【3--无重复的最长字串】 LeetCode【4--有序数组中的中位数】
  4. Tcpdump抓包命令使用
  5. CentOS6.5 安装MongoDB
  6. 如何高效学python编程_如何高效自学编程?天下没有难学的python
  7. access根据所属院系修改学号_2016年计算机二级《Access》冲刺试题及答案
  8. Java字符串查找第一个不重复字符_java如何实现获取字符串中第一个出现不重复的字符...
  9. java毕业设计鸿鹄教育培训mybatis+源码+调试部署+系统+数据库+lw
  10. 云服务优缺点_云服务器优点和缺点详细介绍
  11. c语言编码任务描述,C语言委派任务问题代码及解析
  12. 《纽约客》:还原真实的扎克伯格
  13. MySQL按照字符排序,英文,中文,数字综合排序
  14. 遐想:Android Nexus One Flan
  15. 电脑录音,教你电脑怎么录音
  16. nas与文件服务器对比,NAS网络存储设备为什么能取代文件服务器
  17. 城市轨道交通自动售检票系统
  18. 二本网络工程学生转型大数据开发,放弃京东offer,选择了二线城市
  19. linux socket netstat 状态 LISTENING、ESTABLISHED、SYN_SENT、CLOSE_WAIT、TIME_WAIT、FIN_WAIT2 分别是什么意思?
  20. win7删除系统自带中文简体输入法中美式键盘

热门文章

  1. NS_ASSUME_NONNULL_BEGIN 延伸
  2. ARM Linux 3.x的设备树(Device Tree)【转】
  3. android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题
  4. Exchange 分析器工具介绍及案例分析
  5. html左浮动不管用图片往下放,html - 如何在HTML / CSS中水平对齐图像(浮动和显示内联块不起作用) - 堆栈内存溢出...
  6. PHP的优点和缺点分别是什么,CSS的优点和缺点分别是什么
  7. java 中的内部类介绍
  8. Dos一键清理系统垃圾教程
  9. 怎样学会单片机?先学什么,怎么入门?
  10. java jsp转html_JSP页面转换为HTML页面,动态转静态