41 Flutter 仿京东商城项目签名验证 增加收货地址、显示收货地址 事件广播
加群452892873 下载对应41课文件,运行方法,建好项目,直接替换lib目录
AddressAdd.dart
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_jdshop/config/Config.dart';
import 'package:flutter_jdshop/services/EventBus.dart';
import 'package:flutter_jdshop/services/ScreenAdapter.dart';
import 'package:flutter_jdshop/widget/JdButton.dart';
import 'package:flutter_jdshop/widget/JdText.dart';
import 'package:city_pickers/city_pickers.dart';
import '../../services/UserServices.dart';
import '../../services/SignServices.dart';
class AddressAddPage extends StatefulWidget {
AddressAddPage({Key key}) : super(key: key); _AddressAddPageState createState() => _AddressAddPageState();
} class _AddressAddPageState extends State<AddressAddPage> {
String area = '';
String name = '';
String phone = '';
String address = ''; //页面销毁的时候,触发广播,传递给收货地址列表:
@override
void dispose() {
// TODO: implement dispose
super.dispose();
eventBus.fire(new AddressEvent('增加陈宫...'));
} @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('增加收货地址'),
),
body: Container(
child: ListView(
children: <Widget>[
JdText(
text: "收货人姓名",
onChanged: (value) {
this.name = value;
},
),
SizedBox(height: ),
JdText(
text: "收货人电话",
onChanged: (value) {
this.phone = value;
},
),
SizedBox(height: ),
Container(
padding: EdgeInsets.only(left: ),
height: ScreenAdapter.height(),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(width: , color: Colors.black12))),
child: InkWell(
child: Row(
children: <Widget>[
Icon(Icons.add_location),
this.area.length >
? Text("${this.area}",
style: TextStyle(color: Colors.black54))
: Text("省/市/区",
style: TextStyle(color: Colors.black54))
],
),
onTap: () async {
Result result = await CityPickers.showCityPicker(
context: context,
cancelWidget:
Text('取消', style: TextStyle(color: Colors.black54)),
confirmWidget:
Text("确定", style: TextStyle(color: Colors.blue))); setState(() {
this.area =
"${result.provinceName}/${result.cityName}/${result.areaName}";
});
},
),
),
SizedBox(height: ),
JdText(
text: "详细地址",
maxLines: ,
height: ,
onChanged: (value) {
this.address = "${this.area} ${value}";
},
),
SizedBox(height: ),
RaisedButton(
child: Text("弹出省市区"),
onPressed: () async {
Result result = await CityPickers.showCityPicker(
context: context,
cancelWidget:
Text('取消', style: TextStyle(color: Colors.black54)),
confirmWidget:
Text("确定", style: TextStyle(color: Colors.blue)));
},
),
SizedBox(height: ),
JdButton(
text: "增加",
color: Colors.red,
cb: () async{
List userinfo=await UserServices.getUserInfo();
// print(userinfo);
var tempJson={
"uid":"uid",
"name":this.name,
"phone":this.phone,
"address":this.address,
"salt":userinfo[]["salt"]
};
var sign=SignServices.getSign(tempJson);
// print(sign);
var api="${Config.domain}api/addAddress";
var result=await Dio().post(api,data:{
"uid":userinfo[]["_id"],
"name":this.name,
"phone":this.phone,
"address":this.address,
"sign":sign
});
print(result);
Navigator.pop(context);
},
)
],
),
));
}
}
AddressList.dart
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_jdshop/config/Config.dart';
import 'package:flutter_jdshop/services/EventBus.dart';
import 'package:flutter_jdshop/services/ScreenAdapter.dart';
import 'package:flutter_jdshop/services/SignServices.dart';
import 'package:flutter_jdshop/services/UserServices.dart'; class AddressListPage extends StatefulWidget {
AddressListPage({Key key}) : super(key: key); _AddressListPageState createState() => _AddressListPageState();
} class _AddressListPageState extends State<AddressListPage> {
List addressList = [];
@override
initState() {
super.initState();
this._getAddressList();
//监听增加完收货地址的广播:
eventBus.on<AddressEvent>().listen((event){
print(event.str);
this._getAddressList();
});
} _getAddressList() async {
List userinfo = await UserServices.getUserInfo();
//请求接口:
var temJson = {"uid": userinfo[]['_id'], "salt": userinfo[]['salt']};
var sign = SignServices.getSign(temJson);
var api =
"${Config.domain}api/addressList?uid=${userinfo[0]['_id']}&sign=${sign}";
var response = await Dio().get(api); var responses = response.data["result"];
print(responses);
setState(() {
this.addressList = responses;
});
} @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('收货列表地址'),
),
body: Container(
child: Stack(
children: <Widget>[
ListView(
children: <Widget>[
ListView.builder(
itemCount: this.addressList.length,
itemBuilder: (context, index) {
if (this.addressList[index]['default_address'] == ) {
return Column(
children: <Widget>[
SizedBox(height: ),
ListTile(
leading: Icon(Icons.check, color: Colors.red),
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"${this.addressList[index]["name"]} ${this.addressList[index]["phone"]}"),
SizedBox(height: ),
Text("${this.addressList[index]["address"]}")
]),
trailing: Icon(Icons.edit, color: Colors.blue),
)
],
);
} else {
return Column(
children: <Widget>[
SizedBox(height: ),
ListTile(
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"${this.addressList[index]["name"]} ${this.addressList[index]["phone"]}"),
SizedBox(height: ),
Text("${this.addressList[index]["address"]}")
]),
trailing: Icon(Icons.edit, color: Colors.blue),
)
],
);
}
},
)
],
),
Positioned(
bottom: ,
width: ScreenAdapter.width(),
height: ScreenAdapter.height(),
child: Container(
padding: EdgeInsets.all(),
width: ScreenAdapter.width(),
height: ScreenAdapter.height(),
decoration: BoxDecoration(
color: Colors.red,
border: Border(
top: BorderSide(width: , color: Colors.black26))),
child: InkWell(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(Icons.add, color: Colors.white),
Text('增加收货地址', style: TextStyle(color: Colors.white))
],
),
onTap: () {
Navigator.pushNamed(context, '/addressAdd');
},
)),
)
],
)),
);
}
}
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;
}
} //用户中心广播:
class AddressEvent{
String str;
AddressEvent(String str){
this.str=str;
}
}
SignServices.dart
import 'dart:convert';
import 'package:crypto/crypto.dart';
class SignServices{
static getSign(json){
List attrKeys=json.keys.toList();
attrKeys.sort();
print(attrKeys);
String str='';
for(var i=;i<attrKeys.length;i++){
str+="${attrKeys[i]}${json[attrKeys[i]]}";
}
return md5.convert(utf8.encode(str)).toString();
}
}
41 Flutter 仿京东商城项目签名验证 增加收货地址、显示收货地址 事件广播的更多相关文章
- 40 Flutter仿京东商城项目签名验证原理、签名验证算法
加群452892873 下载对应40课文件,运行方法,建好项目,直接替换lib目录 pubspec.yaml crypto: ^ SignServices.dart import 'dart:conv ...
- 01-02 Flutter仿京东商城项目 功能分析、底部导航Tab切换以及路由配置、架构搭建:(Flutter仿京东商城项目 首页布局以及不同终端屏幕适配方案)
Flutter和Dart交流学习群:交流群:452892873 01Flutter仿京东商城项目 功能分析.底部导航Tab切换以及路由配置.架构搭建 02Flutter仿京东商城项目 首页布局以及不同 ...
- 42 Flutter仿京东商城项目 修改默认收货地址 显示默认收货地址
CheckOut.dart import 'package:flutter/material.dart'; import '../services/ScreenAdapter.dart'; impor ...
- 39 Flutter仿京东商城项目 收货地址列表、增加 修改收货地址布局、弹出省市区选择器
加群452892873 下载对应39课文件,运行方法,建好项目,直接替换lib目录 pubspec.yaml city_pickers: ^ AddressAdd.dart import 'packa ...
- 37 Flutter仿京东商城项目 结算页面布局
加群452892873 下载对应34课文件,运行方法,建好项目,直接替换lib目录 CheckOut.dart import 'package:flutter/material.dart'; impo ...
- 26 Flutter仿京东商城项目 购物车之 event_bus事件广播 事件监听
event_bus 介绍 在前面的课程我们给大家讲过状态管理 Provider 的使用. 通俗的讲状态管理就是:当我们想在多个页面(组件/Widget)之间共享状态(数据),或 者一个页面(组件/Wi ...
- 07-08 Flutter仿京东商城项目 商品分类页面布局:Flutter仿京东商城项目 商品分类页面数据渲染
Flutter实战(交流群:452892873) 本项目是一个实战项目,根据目录建文件,并复制从第一节到最新更新的文章,可以构成完整的一个请求后台数据的项目: CateModel.dart class ...
- 38 Flutter仿京东商城项目 渲染结算页面商品数据
加群452892873 下载对应38课文件,运行方法,建好项目,直接替换lib目录 CartServices.dart import 'dart:convert'; import 'Storage.d ...
- 36 Flutter仿京东商城项目 用户登录 退出登录 事件广播更新状态
Login.dart import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flutter/material.da ...
随机推荐
- logstash可以考虑在项目中用起来
在用Node.js开发项目的时候,我们常用 log4js 模块来进行日志的记录,可以通过配置 log4js 的 Appenders 将日志输出到Console.File和GELF等不同的地方. log ...
- linux 防火墙 firewall 设置
背景: 机房断电后导致机器关机重启,原先访问的地址访问不了,使用终端能访问到该服务器,服务启起来后,用curl + 地址能访问,但在外部浏览器访问不了该地址: 首先想到了端口限制----防火墙 参考博 ...
- POJ1185 炮兵阵地 和 POJ2411 Mondriaan's Dream
炮兵阵地 Language:Default 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 34008 Accepted ...
- Django2-settings常用配置
1. MySQL 数据库连接 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'bms', # 要连接 ...
- Git - Q
GIT :实现版本控制的软件 命令: git init # 初始 git (先执行这个才能执行接下来的) git status # 查看当前文件夹状态 git add 文件名 # 对指定文件进行版本控 ...
- Windows下有用的工具推荐
1.ConEmu多标签命令行工具https://download.fosshub.com/Protected/expiretime=1495446879;badurl=aHR0cDovL3d3dy5m ...
- Jquery使用心得
1.<form>提交时,会提交里面有name属性的元素,而不是id属性 $("#form").serialize(); 得到里面每个元素的拼接值 id=1& ...
- 为什么深度(Ubuntu)Linux挂载NTFS分区只读不可写?
如前所述,经扩展,Dell Vostro 1520笔记本电脑拥有了两块硬盘. 本着旧物利用的心思,在其中一块256GiB固态盘上安装了深度linux,同时挂载另一块2TiB机械盘作为存储盘. 这块 ...
- splay 1296 营业额统计
有一个点超时,确实是个很简单的splay#include<cstdio> #include<iostream> using namespace std; int n,shu[1 ...
- 点云赋值 PointCloudT::Ptr 运行时崩溃
PointCloudT::Ptr cloud; cloud.reset(new PointCloudT); cloud->points.resize(500);for(int index =0; ...