CheckOut.dart

import 'package:flutter/material.dart';
import '../services/ScreenAdapter.dart';
import 'package:provider/provider.dart';
import '../provider/CheckOut.dart';
import '../services/UserServices.dart';
import '../services/SignServices.dart'; import '../config/Config.dart';
import 'package:dio/dio.dart'; import '../services/EventBus.dart'; class CheckOutPage extends StatefulWidget {
CheckOutPage({Key key}) : super(key: key); _CheckOutPageState createState() => _CheckOutPageState();
} class _CheckOutPageState extends State<CheckOutPage> { List _addressList=[];
@override
void initState() {
super.initState();
this._getDefaultAddress(); //监听广播
eventBus.on<CheckOutEvent>().listen((event) {
print(event.str);
this._getDefaultAddress();
});
} _getDefaultAddress() async {
List userinfo = await UserServices.getUserInfo(); // print('1234');
var tempJson = {
"uid": userinfo[]["_id"],
"salt": userinfo[]["salt"]
}; var sign = SignServices.getSign(tempJson); var api = '${Config.domain}api/oneAddressList?uid=${userinfo[0]["_id"]}&sign=${sign}';
var response = await Dio().get(api); print(response);
setState(() { this._addressList=response.data['result'];
}); } Widget _checkOutItem(item) {
return Row(
children: <Widget>[
Container(
width: ScreenAdapter.width(),
child: Image.network("${item["pic"]}", fit: BoxFit.cover),
),
Expanded(
flex: ,
child: Container(
padding: EdgeInsets.fromLTRB(, , , ),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text("${item["title"]}", maxLines: ),
Text("${item["selectedAttr"]}", maxLines: ),
Stack(
children: <Widget>[
Align(
alignment: Alignment.centerLeft,
child: Text("¥${item["price"]}",
style: TextStyle(color: Colors.red)),
),
Align(
alignment: Alignment.centerRight,
child: Text("x${item["count"]}"),
)
],
)
],
),
))
],
);
} @override
Widget build(BuildContext context) {
var checkOutProvider = Provider.of<CheckOut>(context); return Scaffold(
appBar: AppBar(
title: Text("结算"),
),
body: Stack(
children: <Widget>[
ListView(
children: <Widget>[
Container(
color: Colors.white,
child: Column(
children: <Widget>[
SizedBox(height: ),
this._addressList.length>?ListTile(
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text("${this._addressList[0]["name"]} ${this._addressList[0]["phone"]}"),
SizedBox(height: ),
Text("${this._addressList[0]["address"]}"),
],
),
trailing: Icon(Icons.navigate_next),
onTap: () {
Navigator.pushNamed(context, '/addressList');
},
):ListTile(
leading: Icon(Icons.add_location),
title: Center(
child: Text("请添加收货地址"),
),
trailing: Icon(Icons.navigate_next),
onTap: () {
Navigator.pushNamed(context, '/addressAdd');
},
),
SizedBox(height: ),
],
),
),
SizedBox(height: ),
Container(
color: Colors.white,
padding: EdgeInsets.all(ScreenAdapter.width()),
child: Column(
children: checkOutProvider.checkOutListData.map((value) {
return Column(
children: <Widget>[_checkOutItem(value), Divider()],
);
}).toList()),
),
SizedBox(height: ),
Container(
color: Colors.white,
padding: EdgeInsets.all(ScreenAdapter.width()),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text("商品总金额:¥100"),
Divider(),
Text("立减:¥5"),
Divider(),
Text("运费:¥0"),
],
),
)
],
),
Positioned(
bottom: ,
width: ScreenAdapter.width(),
height: ScreenAdapter.height(),
child: Container(
padding: EdgeInsets.all(),
width: ScreenAdapter.width(),
height: ScreenAdapter.height(),
decoration: BoxDecoration(
color: Colors.white,
border:
Border(top: BorderSide(width: , color: Colors.black26))),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.centerLeft,
child: Text("总价:¥140", style: TextStyle(color: Colors.red)),
),
Align(
alignment: Alignment.centerRight,
child: RaisedButton(
child:
Text('立即下单', style: TextStyle(color: Colors.white)),
color: Colors.red,
onPressed: () {},
),
)
],
),
),
)
],
),
);
}
}

AddressList.dart

import 'package:flutter/material.dart';
import '../../services/ScreenAdapter.dart'; import '../../services/UserServices.dart';
import '../../services/SignServices.dart'; import '../../config/Config.dart';
import 'package:dio/dio.dart'; import '../../services/EventBus.dart'; class AddressListPage extends StatefulWidget {
AddressListPage({Key key}) : super(key: key); _AddressListPageState createState() => _AddressListPageState();
} class _AddressListPageState extends State<AddressListPage> {
List addressList = []; @override
void initState() {
super.initState();
this._getAddressList(); //监听增加收货地址的广播
eventBus.on<AddressEvent>().listen((event) {
// print(event.str);
this._getAddressList();
});
}
//监听页面销毁的事件
dispose(){
super.dispose();
eventBus.fire(new CheckOutEvent('改收货地址成功...'));
} //获取收货地址列表
_getAddressList() async {
//请求接口
List userinfo = await UserServices.getUserInfo(); var tempJson = {"uid": userinfo[]['_id'], "salt": userinfo[]["salt"]}; var sign = SignServices.getSign(tempJson); var api =
'${Config.domain}api/addressList?uid=${userinfo[0]['_id']}&sign=${sign}'; var response = await Dio().get(api);
// print(response.data["result"]); setState(() {
this.addressList = response.data["result"];
});
} //修改默认收货地址
_changeDefaultAddress(id) async{ List userinfo = await UserServices.getUserInfo(); var tempJson = {"uid": userinfo[]['_id'], "id":id,"salt": userinfo[]["salt"]}; var sign = SignServices.getSign(tempJson); var api =
'${Config.domain}api/changeDefaultAddress';
var response = await Dio().post(api,data:{
"uid": userinfo[]['_id'],
"id":id,
"sign":sign
});
Navigator.pop(context); } //删除收货地址 _delAddress(id) async{ List userinfo=await UserServices.getUserInfo();
var tempJson={
"uid":userinfo[]["_id"],
"id":id,
"salt":userinfo[]["salt"]
}; var sign=SignServices.getSign(tempJson); var api = '${Config.domain}api/deleteAddress';
var response = await Dio().post(api,data:{
"uid":userinfo[]["_id"],
"id":id,
"sign":sign
});
this._getAddressList(); //删除收货地址完成后重新获取列表 } //弹出框
_showDelAlertDialog(id) async{ var result= await showDialog(
barrierDismissible:false, //表示点击灰色背景的时候是否消失弹出框
context:context,
builder: (context){
return AlertDialog(
title: Text("提示信息!"),
content:Text("您确定要删除吗?") ,
actions: <Widget>[
FlatButton(
child: Text("取消"),
onPressed: (){
Navigator.pop(context);
},
),
FlatButton(
child: Text("确定"),
onPressed: () async{
//执行删除操作
this._delAddress(id);
Navigator.pop(context); },
)
], );
}
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("收货地址列表"),
),
body: Container(
child: Stack(
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: InkWell(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"${this.addressList[index]["name"]} ${this.addressList[index]["phone"]}"),
SizedBox(height: ),
Text("${this.addressList[index]["address"]}"),
]), onTap: (){ this._changeDefaultAddress(this.addressList[index]["_id"]);
},
onLongPress: (){
this._showDelAlertDialog(this.addressList[index]["_id"]);
}, ),
trailing: IconButton(
icon:Icon(Icons.edit, color: Colors.blue),
onPressed: (){
Navigator.pushNamed(context, '/addressEdit',arguments: {
"id":this.addressList[index]["_id"],
"name":this.addressList[index]["name"],
"phone":this.addressList[index]["phone"],
"address":this.addressList[index]["address"],
});
},
),
),
Divider(height: ),
],
);
} else {
return Column(
children: <Widget>[
SizedBox(height: ),
ListTile(
title:InkWell(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
"${this.addressList[index]["name"]} ${this.addressList[index]["phone"]}"),
SizedBox(height: ),
Text("${this.addressList[index]["address"]}"),
]),
onTap: (){
this._changeDefaultAddress(this.addressList[index]["_id"]); },
onLongPress: (){
this._showDelAlertDialog(this.addressList[index]["_id"]);
},
),
trailing: IconButton(
icon:Icon(Icons.edit, color: Colors.blue),
onPressed: (){
Navigator.pushNamed(context, '/addressEdit',arguments: {
"id":this.addressList[index]["_id"],
"name":this.addressList[index]["name"],
"phone":this.addressList[index]["phone"],
"address":this.addressList[index]["address"],
});
},
),
),
Divider(height: ),
],
);
}
},
),
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;
}
} //结算页面
class CheckOutEvent{
String str;
CheckOutEvent(String str){
this.str=str;
}
}

AddressAdd.dart

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../../services/ScreenAdapter.dart'; import '../../widget/JdText.dart'; import '../../widget/JdButton.dart'; import 'package:city_pickers/city_pickers.dart'; import '../../services/UserServices.dart';
import '../../services/SignServices.dart'; import '../../config/Config.dart';
import 'package:dio/dio.dart'; import '../../services/EventBus.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=''; //监听页面销毁的事件
dispose(){
super.dispose();
eventBus.fire(new AddressEvent('增加成功...'));
eventBus.fire(new CheckOutEvent('改收货地址成功...'));
} @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("增加收货地址"),
),
body: Container(
padding: EdgeInsets.all(),
child: ListView(
children: <Widget>[
SizedBox(height: ),
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.blue)),
confirmWidget:
Text("确定", style: TextStyle(color: Colors.blue))
); print(result);
setState(() {
this.area= "${result.provinceName}/${result.cityName}/${result.areaName}";
});
},
),
),
SizedBox(height: ),
JdText(
text: "详细地址",
maxLines: ,
height: ,
onChanged: (value){
this.address="${this.area} ${value}";
},
),
SizedBox(height: ),
SizedBox(height: ),
JdButton(text: "增加", color: Colors.red,cb: () async{ List userinfo=await UserServices.getUserInfo(); print(userinfo); // print('1234');
var tempJson={
"uid":userinfo[]["_id"],
"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
}); // if(result.data["success"]){ // }
Navigator.pop(context); })
],
),
));
}
}

42 Flutter仿京东商城项目 修改默认收货地址 显示默认收货地址的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. MySQL 中 关于 find_in_set 用法

    在项目中用的是 EF.MySQL,在查询中用到某一个字段的值在某几个中.一开始想到的是 in. 但是,这个字段是 int 类型的,传入的参数需要用“,”分隔.这样传入的就是字符型的. 这样的结果是:本 ...

  2. 如何在vscode中用standard style 风格去验证 vue文件

    1 JavaScript Standard Style简介 本工具通过以下三种方式为你(及你的团队)节省大量时间: 无须配置. 史上最便捷的统一代码风格的方式,轻松拥有. 自动代码格式化. 只需运行 ...

  3. GreenPlum/postgres copy命令导出/导入数据

    一.COPY命令简单实用 1.copy在postgres与GreenPlum介绍 1.1 postgrespostgres的COPY命令可以快速的导出/导入数据到postgresql数据库中,支持常用 ...

  4. prometheus 监控ElasticSearch核心指标

    ES监控方案 本文主要讲述使用 Prometheus监控ES,梳理核心监控指标并构建 Dashboard ,当集群有异常或者节点发生故障时,可以根据性能图表以高效率的方式进行问题诊断,再对核心指标筛选 ...

  5. C++类*类型和其他类型相互转换

    类类型转换时会出现两种之间转换,下面我们说的是类类型 1.其他类型转换为本类类型 通过类带一个参数的构造函数:或者多个参数构造函数,除了第一个参数后面参数都有默认值时!这样在其他类型赋值给该类类型对象 ...

  6. TCP数据的传输过程

    建立连接后,两台主机就可以相互传输数据了.如下图所示: 上图给出了主机A分2次(分2个数据包)向主机B传递200字节的过程.首先,主机A通过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 ...

  7. Scrapy爬虫的暂停和启动

    scrapy的每一个爬虫,暂停时可以记录暂停状态以及爬取了哪些url,重启时可以从暂停状态开始爬取过的URL不在爬取 实现暂停与重启记录状态 方法一: 1.首先cd进入到scrapy项目里(当然你也可 ...

  8. [Shell]Redis未授权访问反弹shell

    原作者:Cream 文章出处: 贝塔安全实验室 0x01 Redis未授权访问反弹shell Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value ...

  9. meshing-划分圆柱结构化网格

    原视频下载地址:https://yunpan.cn/cqjeckrzEpVkY  访问密码 eb5d

  10. LeetCode 第 153 场周赛

    一.公交站间的距离(LeetCode-5181) 1.1 题目描述 1.2 解题思路 比较简单的一题,顺时针.逆时针两次遍历,就能解决. 1.3 解题代码 class Solution { publi ...