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 ...
随机推荐
- C#中流Stream的使用-学习
概念 提供字节序列的一般视图.这是一个抽象类. 子类: Derived Microsoft.JScript.COMCharStream System.Data.OracleClient.OracleB ...
- 使用BCP实用工具导出导入数据
https://docs.microsoft.com/zh-cn/sql/tools/bcp-utility?view=sql-server-ver15 bcp 实用工具可以在 Microsoft S ...
- P1273 有线电视网[分组背包+树形dp]
题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...
- C++——构造和析构函数
现在学习进入第三阶段,对c++要有更深入的学习,关于构造函数和析构函数这一块需要总结一下,来深刻理解这两个函数的意义. 什么是构造函数和析构函数呢呢?听着就很高大上,但是要从心里藐视它.就像自然万物有 ...
- Mysql 安装,及其闪退的问题解决
1.下载 Mysql 64下载链接(华军软件) http://soft.onlinedown.net/soft/3573.htm 2.安装 2.1 傻瓜式安装 不再赘述,略过. 2.2安装完成打开闪退 ...
- mysql对子查询的优化改写
重庆SEO:<高性能mysql第三版>提到mysql会将in子查询改写成exists查询(书中基于的mysql版本是5.1.50和5.5) 但是在5.6之后,已经优化成使用半连接查询 SE ...
- [51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)
题目描述 求∑i=1n∑j=1n(i,j) mod (1e9+7)n<=1010\sum_{i=1}^n\sum_{j=1}^n(i,j)~mod~(1e9+7)\\n<=10^{10}i ...
- CSP2019 D1T3 树上的数 (贪心+并查集)
题解 因为博主退役了,所以题解咕掉了.先放个代码 CODE #include<bits/stdc++.h> using namespace std; const int MAXN = 20 ...
- Appium自动化测试教程-自学网-monkey日志管理
日志管理作用 Monkey日志管理是Monkey测试中非常重要的一个环节,通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和 ...
- java大文件上传解决方案
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...