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. React 零碎笔记

    1.对数组的操作(添加.更新.删除) const posts = [...this.state.posts]; posts.push(post); this.setState({posts}); =& ...

  2. 七、Linq To XML:XElement、XDocument

    一.概述 LINQ to XMLLINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework.NET Framework 编程语言中处理 XM ...

  3. 2.4 vue配置(下)

  4. Python3入门与进阶【笔记】

    1.二.八.十六进制转十进制:int('10', base=2).int('10', base=8).int('10', base=16): 2.八.十.十六进制转二进制:bin(0o+xxx).bi ...

  5. sping boot 笔记 哎呦不错哦

    http://blog.csdn.net/u011998835/article/details/78352829 学习

  6. 使用webuploader实现分片上传

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  7. gdisk分区命令

    GPT fdisk(由gdisk.cgdisk.sgdisk和fixparts程序组成)是一组用于Linux.FreeBSD.Mac OS X和Windows的文本模式分区工具.gdisk.cgdis ...

  8. NodeJS后台

    NodeJS后台 后台: 1.PHP 2.Java 3.Python 优势 1.性能 2.跟前台JS配合方便 3.NodeJS便于前端学习 https://nodejs.org/en/ 1.切换盘符 ...

  9. 实现返回顶部-wepy小程序-前端梳理

    <script type="text/javascript" src="http://hovertree.com/ziyuan/jquery/jquery-1.11 ...

  10. 【原创】go语言学习(七)数组

    目录 数组定义 二维数组 数组拷贝.传参 数组定义 1. 数组是同一类型的元素集合. var a [3]int //定义一个数组 //Go中数组下标从0开始,因此⻓长度为n的数组下标范围:[0,n-1 ...