加群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 仿京东商城项目签名验证 增加收货地址、显示收货地址 事件广播的更多相关文章

  1. 40 Flutter仿京东商城项目签名验证原理、签名验证算法

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

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

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

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

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

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

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

  5. 37 Flutter仿京东商城项目 结算页面布局

    加群452892873 下载对应34课文件,运行方法,建好项目,直接替换lib目录 CheckOut.dart import 'package:flutter/material.dart'; impo ...

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

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

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

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

  8. 38 Flutter仿京东商城项目 渲染结算页面商品数据

    加群452892873 下载对应38课文件,运行方法,建好项目,直接替换lib目录 CartServices.dart import 'dart:convert'; import 'Storage.d ...

  9. 36 Flutter仿京东商城项目 用户登录 退出登录 事件广播更新状态

    Login.dart import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:flutter/material.da ...

随机推荐

  1. 如何写好demo——学习感悟

    文章标题:教你如何写好Demo应用 如何制作出最有用的demo呢? 简,易 在demo中,我们要专注于单一的主题.我们的教学覆盖了很大的知识范围,因此,化整为零是非常必要的. 例如,我们要说明Andr ...

  2. 在cmd运行窗口运行.py文件

    步骤

  3. 微信支付报调用支付JSAPI缺少参数: sign

    检查后台返回参数中没有paySign字段

  4. Java原子类--AtomicLongFieldUpdater

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3514623.html AtomicLongFieldUpdater介绍和函数列表 AtomicLongF ...

  5. 在 windows 上安装 git 2.22

    下载 by win 下载地址:https://git-scm.com/download/win 如下图.选择对应的版本下载: 安装 by win 1.双击下载好的git安装包.弹出提示框.如下图: 2 ...

  6. 7月新的开始 - Axure学习06 - 母版的使用

    母版的使用 主导航.底部.在很多页面上都是一样的: 如果在每一个页面都写一次的化.话.是非常浪费时间的,为了方便.可以使用母版: 母版可以帮助我们将一些元素重复利用,既可以保证页面的统一性.还可以节省 ...

  7. SSL 部署,实现 https 化

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

  8. javascript动态合并表格相同的单元格

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  9. 通过反射获取DataSource里数据源的账号密码

    public Connection getDbConnection() { Connection conn = null; // 获得连接 DataSource ds = null; try { Co ...

  10. POI之SXSSFWorkbook大量数据导出至excel

    一:简介          SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel,          SXSSFWorkbook专门处理大数据,对于大型 ...