36 Flutter仿京东商城项目 用户登录 退出登录 事件广播更新状态
Login.dart
import 'dart:convert'; import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_jdshop/config/Config.dart';
import 'package:flutter_jdshop/pages/tabs/Tabs.dart';
import 'package:flutter_jdshop/services/ScreenAdapter.dart';
import 'package:flutter_jdshop/services/Storage.dart';
import 'package:flutter_jdshop/widget/JdButton.dart';
import 'package:fluttertoast/fluttertoast.dart';
import '../widget/JdText.dart';
import '../widget/JdText.dart'; import '../services/EventBus.dart'; class LoginPage extends StatefulWidget {
LoginPage({Key key}) : super(key: key); _LoginPageState createState() => _LoginPageState();
} class _LoginPageState extends State<LoginPage> {
//监听登录页面销毁的事件:
dispose(){
super.dispose();
eventBus.fire(new UserEvent("登录成功..."));
} String username = "";
String password = '';
doLogin() async {
RegExp reg = new RegExp(r"^1\d{10}$");
if (!reg.hasMatch(this.username)) {
Fluttertoast.showToast(
msg: "手机号格式不正确",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER);
} else if (password.length < ) {
Fluttertoast.showToast(
msg: "密码不正确",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER);
} else {
var api = "${Config.domain}api/doLogin";
var response = await Dio().post(api,
data: {"username": this.username, "password": this.password});
if (response.data["success"]) {
print(response);
//保存信息,
Storage.setString('userInfo',json.encode(response.data["userinfo"]));
Navigator.pop(context);
} else {
Fluttertoast.showToast(
msg: "${response.data["message"]}",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
}
} @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.close),
onPressed: () {
Navigator.pop(context);
},
),
title: Text('登录页面'),
actions: <Widget>[
FlatButton(
child: Text('客服'),
onPressed: () {},
)
],
),
body: Container(
padding: EdgeInsets.all(ScreenAdapter.width()),
child: ListView(
children: <Widget>[
Center(
child: Container(
margin: EdgeInsets.only(top: ),
height: ScreenAdapter.width(),
width: ScreenAdapter.width(),
child: Image.asset('images/login.png',fit: BoxFit.cover),
// child: Image.network(
// 'https://www.iting.com/images/flutter/list5.jpg'),
),
),
JdText(
text: "请输入用户名",
onChanged: (value) {
print(value);
this.username = value;
},
),
SizedBox(height: ),
JdText(
text: "请输入密码",
password: true,
onChanged: (value) {
print(value);
this.password = value;
},
),
SizedBox(height: ),
Container(
padding: EdgeInsets.all(ScreenAdapter.width()),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.centerLeft,
child: Text("忘记密码"),
),
Align(
alignment: Alignment.centerRight,
child: InkWell(
onTap: () {
Navigator.pushNamed(context, '/RegisterFirst');
},
child: Text("新用户注册"),
),
)
],
),
),
SizedBox(height: ),
JdButton(
text: "登录",
color: Colors.red,
cb: doLogin,
)
],
),
),
);
}
}
User.dart
import 'package:flutter/material.dart';
import 'package:flutter_jdshop/services/ScreenAdapter.dart';
import 'package:flutter_jdshop/services/Storage.dart';
import 'package:flutter_jdshop/services/UserServices.dart';
import 'package:flutter_jdshop/widget/JdButton.dart';
import '../../services/EventBus.dart'; class UserPage extends StatefulWidget {
UserPage({Key key}) : super(key: key); _UserPageState createState() => _UserPageState();
} class _UserPageState extends State<UserPage> {
bool isLogin = false;
List userInfo = [];
@override
void initState() {
// TODO: implement initState
super.initState();
this._getUserinfo();
//监听登录页面改变的事件:
eventBus.on<UserEvent>().listen((event) {
print(event.str);
this._getUserinfo();
});
} _getUserinfo() async {
var isLogin = await UserServices.getUserLoginState();
var userInfo = await UserServices.getUserInfo();
print(userInfo);
print(isLogin);
setState(() {
this.userInfo = userInfo;
this.isLogin = isLogin;
});
} @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("用户中心"),
),
body: ListView(
children: <Widget>[
Container(
height: ScreenAdapter.height(),
width: double.infinity,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('images/user_bg.jpg'),
fit: BoxFit.cover)),
child: Row(
children: <Widget>[
Container(
margin: EdgeInsets.fromLTRB(, , , ),
child: ClipOval(
child: Image.asset(
'images/user.png',
fit: BoxFit.cover,
width: ScreenAdapter.width(),
height: ScreenAdapter.width(),
),
),
),
!this.isLogin
? Expanded(
flex: ,
child: InkWell(
onTap: () {
Navigator.pushNamed(context, '/login');
},
child: Text('登录/注册',
style: TextStyle(color: Colors.white)),
),
)
: Expanded(
flex: ,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text("用户名:${this.userInfo[0]["username"]}",
style: TextStyle(
color: Colors.white,
fontSize: ScreenAdapter.size())),
Text("普通会员",
style: TextStyle(
color: Colors.white,
fontSize: ScreenAdapter.size()))
],
),
),
],
),
),
ListTile(
leading: Icon(Icons.home, color: Colors.red), title: Text('首页')),
Divider(),
ListTile(leading: Icon(Icons.home), title: Text('首页')),
ListTile(leading: Icon(Icons.home), title: Text('首页')),
ListTile(leading: Icon(Icons.home), title: Text('首页')),
this.isLogin
? Container(
padding: EdgeInsets.all(),
child: JdButton(
color: Colors.red,
text: "退出登录",
cb: () {
UserServices.loginOut();
this._getUserinfo();
},
),
)
: Text("")
],
),
);
}
}
EventBus.dart
import 'package:event_bus/event_bus.dart'; //Bus 初始化 EventBus eventBus = EventBus();
//商品详情广播数据:
class ProductContentEvent{
String str;
ProductContentEvent(String str){
this.str=str;
}
} //用户中心广播:
class UserEvent{
String str;
UserEvent(String str){
this.str=str;
}
}
UserServices.dart
import 'dart:convert';
import '../services/Storage.dart';
class UserServices {
static getUserInfo() async {
List userinfo;
try {
List userInfoData = json.decode(await Storage.getString("userInfo"));
userinfo = userInfoData;
} catch (e) {
userinfo = [];
}
return userinfo;
}
static getUserLoginState() async{
var userInfo =await UserServices.getUserInfo();
if (userInfo.length > && userInfo[]['username'] != "") {
return true;
}
return false;
}
static loginOut() {
Storage.remove("userInfo");
}
}
RegisterThird.dart
import 'dart:convert'; import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_jdshop/config/Config.dart';
import 'package:flutter_jdshop/widget/JdButton.dart';
import 'package:flutter_jdshop/widget/JdText.dart';
import 'package:fluttertoast/fluttertoast.dart';
import '../services/Storage.dart'; //引入Tabs:
import '../pages/tabs/Tabs.dart';
class RegisterThirdPage extends StatefulWidget {
Map arguments;
RegisterThirdPage({Key key, this.arguments}) : super(key: key); _RegisterThirdPageState createState() => _RegisterThirdPageState();
} class _RegisterThirdPageState extends State<RegisterThirdPage> {
String tel;
String code;
String password='';
String rpassword='';
@override
void initState() {
// TODO: implement initState
super.initState();
this.tel = widget.arguments["tel"];
this.code = widget.arguments["code"];
} //注册:
doRegister() async {
if (password.length < ) {
Fluttertoast.showToast(
msg: "密码长度不能小于6位",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
} else if (password != rpassword) {
Fluttertoast.showToast(
msg: "密码和确认密码不一致",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}else{
var api = '${Config.domain}api/register';
var responses = await Dio().post(api, data: {
"tel": this.tel,
"code": this.code,
"password": this.password
});
if (responses.data["success"]) {
//保存信息,
Storage.setString('userInfo',json.encode(responses.data['userinfo']) );
//返回到根:
Navigator.of(context).pushAndRemoveUntil(
new MaterialPageRoute(builder: (context)=>new Tabs()),
(route)=>route==null);
} else {
Fluttertoast.showToast(
msg: "${responses.data["message"]}",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
}
} @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('用户注册-第三步'),
),
body: Container(
padding: EdgeInsets.all(),
child: ListView(
children: <Widget>[
SizedBox(height: ),
JdText(
text: "请输入密码",
password: true,
onChanged: (value) {
this.password=value;
print(value);
},
),
SizedBox(height: ),
JdText(
text: "请输入确认密码",
password: true,
onChanged: (value) {
this.rpassword=value;
print(value);
},
),
SizedBox(height: ),
JdButton(
text: "注册",
color: Colors.red,
cb: doRegister,
)
],
),
),
);
}
}
//
36 Flutter仿京东商城项目 用户登录 退出登录 事件广播更新状态的更多相关文章
- 01-02 Flutter仿京东商城项目 功能分析、底部导航Tab切换以及路由配置、架构搭建:(Flutter仿京东商城项目 首页布局以及不同终端屏幕适配方案)
Flutter和Dart交流学习群:交流群:452892873 01Flutter仿京东商城项目 功能分析.底部导航Tab切换以及路由配置.架构搭建 02Flutter仿京东商城项目 首页布局以及不同 ...
- 26 Flutter仿京东商城项目 购物车之 event_bus事件广播 事件监听
event_bus 介绍 在前面的课程我们给大家讲过状态管理 Provider 的使用. 通俗的讲状态管理就是:当我们想在多个页面(组件/Widget)之间共享状态(数据),或 者一个页面(组件/Wi ...
- 32Flutter仿京东商城项目 用户中心页面布局
import 'package:flutter/material.dart'; import 'package:flutter_jdshop/services/ScreenAdapter.dart'; ...
- 42 Flutter仿京东商城项目 修改默认收货地址 显示默认收货地址
CheckOut.dart import 'package:flutter/material.dart'; import '../services/ScreenAdapter.dart'; impor ...
- 41 Flutter 仿京东商城项目签名验证 增加收货地址、显示收货地址 事件广播
加群452892873 下载对应41课文件,运行方法,建好项目,直接替换lib目录 AddressAdd.dart import 'package:dio/dio.dart'; import 'pac ...
- 16 Flutter仿京东商城项目 跳转到搜索页面实现搜索功能 以及搜索筛选
ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...
- 14 Flutter仿京东商城项目 头部搜索导航布局 修改主题 修正ScreenAdapter类
main.dart import 'package:flutter/material.dart'; import 'routes/router.dart'; void main() => run ...
- 07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染
Flutter实战(交流群:452892873) 本项目是一个实战项目,根据目录建文件,并复制从第一节到最新更新的文章,可以构成完整的一个请求后台数据的项目: CateModel.dart class ...
- 39 Flutter仿京东商城项目 收货地址列表、增加 修改收货地址布局、弹出省市区选择器
加群452892873 下载对应39课文件,运行方法,建好项目,直接替换lib目录 pubspec.yaml city_pickers: ^ AddressAdd.dart import 'packa ...
随机推荐
- 前端面试题-JavaScript
引用GitHub 上 ltadpoles的前端面试 https://github.com/ltadpoles 目录 1. JavaScript 有哪些数据类型 2. 怎么判断不同的JS数据类型 ...
- Mysql 安装,及其闪退的问题解决
1.下载 Mysql 64下载链接(华军软件) http://soft.onlinedown.net/soft/3573.htm 2.安装 2.1 傻瓜式安装 不再赘述,略过. 2.2安装完成打开闪退 ...
- 2019牛客多校A All-one Matrices——单调栈
题目 求非嵌套子矩阵的个数. 分析 单调栈的套路题(类似的有求最大子矩阵). 首先,按列预处理,每个位置化成连续1的个数. 例如,左边的图转成右边. 然后枚举 ...
- ElementUI 之 Message,自动弹出,信息不显示问题
Vue.use() 这种写法可能会页面刷新时自动弹出 message,可将下图红框里换成 Vue.component(Message)
- 005_simulink建立条件子系统
1. 条件执行子系统 a) 使能子系统:是控制信号大于零时执行的子系统.在控制信号穿越零点由负变正的时步点上,使能子系统开始执行.只要子系统的控制信号保持正值,使能子系统就会保持在执行的状态 b) ...
- Spring事务采坑 —— timeout
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_18860653/article/d ...
- 在默认使用apache中央仓库时, 报错 protocol_version
https://cloud.tencent.com/developer/ask/136221/answer/241408 2018年6月,为了提高安全性和符合现代标准,不安全的TLS 1.0和1.1协 ...
- python 监视和控制鼠标键盘的输入(使用pynput 而非pyhook)
百度上搜到的文章大多基于pyhook, pip不能直接安装,托管在sourceForge上的代码仓库也找不到. google上发现可以使用pynput,貌似控制更为简单,而且可以直接使用pip安装 示 ...
- [luogu P1527]矩阵乘法(矩形k小)
传送门 Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Solution 整体二分 练习一波... 就是一堆询问放在一起二分 另外的,第一次发现原来矩 ...
- Spring Cloud Gateway(九):网关过滤器 GatewayFilter
本文基于 spring cloud gateway 2.0.1 1.简介 GatewayFilter 网关过滤器用于拦截并链式处理web请求,可以实现横切的与应用无关的需求,比如:安全.访问超时的设置 ...