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. GPU---NVIDIA GPU 计算能力

    查询网址:https://developer.nvidia.com/cuda-gpus 使用,makefile文件实例: GPU= CUDNN= OPENCV= OPENMP= DEBUG= ARCH ...

  2. MySQL服务器

    ---恢复内容开始--- mysql是基于C/S端的服务器软件 mysql服务端 -server端开启 -解析指令 -对文件夹.文件.数据的增删改查 mysql客户端 -连接S段 -发送指令(sql语 ...

  3. 【最短路+较复杂处理】PAT-L3-005. 垃圾箱分布

    L3-005. 垃圾箱分布 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住.所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方[此处为第一重排序选择的条件],同时还要保 ...

  4. 我花了2个月时间,整理了100篇Linux技术精华,技术人必看

    一个以技术为立身根基的教育机构做出来的微信号,干货程度会有多高? 马哥Linux运维公众号运营五年,从一开始的定位就是给技术人分享加薪干货的地方.这五年里,公众号运营最重的任务就是做内容.内容并不好做 ...

  5. idea启动springboot项目报Error running 'ServiceStarter': Command line is too long. Shorten command line for ServiceStarter or also for Application

    解决办法:在.idea文件夹下面的workspace.xml中的 <component name="PropertiesComponent">标签下面添加: <p ...

  6. SSL 部署,实现 https 化

    HTTPS 请求更安全, 且容易被搜索引擎收录. 现在很多服务器都有免费证书如腾讯云.七牛云.阿里云. 本篇以阿里云为例. 一.申请 SSL 证书 1.登录阿里云服务器: 2.产品与服务 -> ...

  7. CSS float详解

    前言:在我们写CSS样式的时候,float,position,display,overflow这几个关键字用得比较多. 弄清楚他们之间的原理,我们可以更高效的写出我们想要的布局. 作者:Ry-yuan ...

  8. 14 Vue列表渲染

    列表渲染 用 v-for 把一个数组对应为一组元素(for循环) 我们可以用 v-for 指令基于一个数组来渲染一个列表. v-for 指令需要使用 item in items 形式的特殊语法, 其中 ...

  9. 微信小程序之小技能篇(一)

    1,三目运算改变class值: <view class="{{flag ? 'change' : 'change_after'}}">改变字体颜色</view&g ...

  10. [ARIA] Accessible animations with reduced motion

    Animations can make people sick, or worse! By adding animation toggles and listening in to the user' ...