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仿京东商城项目 用户登录 退出登录 事件广播更新状态的更多相关文章

  1. 01-02 Flutter仿京东商城项目 功能分析、底部导航Tab切换以及路由配置、架构搭建:(Flutter仿京东商城项目 首页布局以及不同终端屏幕适配方案)

    Flutter和Dart交流学习群:交流群:452892873 01Flutter仿京东商城项目 功能分析.底部导航Tab切换以及路由配置.架构搭建 02Flutter仿京东商城项目 首页布局以及不同 ...

  2. 26 Flutter仿京东商城项目 购物车之 event_bus事件广播 事件监听

    event_bus 介绍 在前面的课程我们给大家讲过状态管理 Provider 的使用. 通俗的讲状态管理就是:当我们想在多个页面(组件/Widget)之间共享状态(数据),或 者一个页面(组件/Wi ...

  3. 32Flutter仿京东商城项目 用户中心页面布局

    import 'package:flutter/material.dart'; import 'package:flutter_jdshop/services/ScreenAdapter.dart'; ...

  4. 42 Flutter仿京东商城项目 修改默认收货地址 显示默认收货地址

    CheckOut.dart import 'package:flutter/material.dart'; import '../services/ScreenAdapter.dart'; impor ...

  5. 41 Flutter 仿京东商城项目签名验证 增加收货地址、显示收货地址 事件广播

    加群452892873 下载对应41课文件,运行方法,建好项目,直接替换lib目录 AddressAdd.dart import 'package:dio/dio.dart'; import 'pac ...

  6. 16 Flutter仿京东商城项目 跳转到搜索页面实现搜索功能 以及搜索筛选

    ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...

  7. 14 Flutter仿京东商城项目 头部搜索导航布局 修改主题 修正ScreenAdapter类

    main.dart import 'package:flutter/material.dart'; import 'routes/router.dart'; void main() => run ...

  8. 07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染

    Flutter实战(交流群:452892873) 本项目是一个实战项目,根据目录建文件,并复制从第一节到最新更新的文章,可以构成完整的一个请求后台数据的项目: CateModel.dart class ...

  9. 39 Flutter仿京东商城项目 收货地址列表、增加 修改收货地址布局、弹出省市区选择器

    加群452892873 下载对应39课文件,运行方法,建好项目,直接替换lib目录 pubspec.yaml city_pickers: ^ AddressAdd.dart import 'packa ...

随机推荐

  1. KubeEdge,一个Kubernetes原生边缘计算框架

    ​KubeEdge成为第一个Kubernetes原生边缘计算平台,Edge和云组件现已开源! 开源边缘计算正在经历其业界最具活力的发展阶段.如此多的开源平台,如此多的整合以及如此多的标准化举措!这显示 ...

  2. GIS 基础知识简介

    前言 前一段时间,在公司进行了分析 GIS 基础信息的介绍.之所以会有这个介绍以及为什么是我?这个个中缘由说下. 公司不是一个GIS方面的公司,但是由于业务的需要,经常需要用到地图(要和地图打交道), ...

  3. archlinux 使用 postgresql

    一.安装与初始化 1.初始化数据目录 默认安装后已创建 postgres 系统用户 切换到 postgres 用户 $ sudo -iu postgres # Or su - postgres for ...

  4. jQuery隐藏和显示从上往下的实现方法

    jquery 显示隐藏方法实现动画效果 方向 显示 隐藏 左上角到右下角 show() hide() 垂直向下 slideDown() slideUp() 水平与垂直两个方向 toggle() 垂直向 ...

  5. C#当前运行所在目录集合

    //获取当前进程的完整路径,包含文件名(进程名).string str = this.GetType().Assembly.Location;result: X:\xxx\xxx\xxx.exe (. ...

  6. 2019-2020-1 20199312《Linux内核原理与分析》第六周作业

    删除旧版menu克隆新版menu并运行 rm -rf menu git clone http://github.com/mengning/menu.git make rootfs 查看新增功能,及其具 ...

  7. div 水平垂直居中

    css <style> .main{ background: #999999; width: 600px; height: 400px; position: absolute; top: ...

  8. 智能灯控(基于ZigBee)

    时间:2017年12月 阶段:大二上学期 背景:单片机原理与应用课设 名称:智能灯控 摘要 本系统实现了多方式控灯功能,有按键控灯.串口指令控灯.点对点无线射频控灯.AI模式控灯.其中AI模式控灯是通 ...

  9. php数据类型之查看和判断数据类型

    我们知道了一个数据的类型,才能进行下一步操作.后面的时候,大家可以学习到更多的知识——自定义功能(函数). 我们来做一个场景模拟:(注:眼前不用会写这个函数,以后会教大家) 假设,我们可以写一个智能的 ...

  10. Elasticsearch 监控

    导语 Elasticsearch(文中简称ES)是分布式全文搜索引擎,产品提供高可用.易扩展以及近实时的搜索能力,广泛应用于数据存储.搜索和实时分析.很多服务的可用性对ES重度依赖.因此,保障ES自身 ...