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. Springboot分别使用乐观锁和分布式锁(基于redisson)完成高并发防超卖

    原文 :https://blog.csdn.net/tianyaleixiaowu/article/details/90036180 乐观锁 乐观锁就是在修改时,带上version版本号.这样如果试图 ...

  2. Visual Studio C# 利用git和github协同开发时产生冲突的解决办

    Visual Studio C# 利用git和Github协同开发时产生冲突的解决办法 前言:在前两天的助教作业中,发现了自己没有办法解决在用vs开发C#的窗体项目的过程中产生的冲突问题,在查阅了资料 ...

  3. Redis未授权漏洞检测工具

    Redis未授权检测小工具 #!/usr/bin/python3 # -*- coding: utf-8 -*- """ @Author: r0cky @Time: 20 ...

  4. GET和POST的区别【转载】

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  5. Android测试monkeyRunner

    monkeyrunner的官方文档: https://developer.android.com/studio/test/monkeyrunner monkeyrunner脚本可以执行截图操作 具体执 ...

  6. 006_Python3 数字(Number)

    1. Python 数字数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间.   以下实例在变量赋值时 Number 对象将被创建: var1 = ...

  7. 代码编辑器——Visual Studio Code

    一.介绍 Visual Studio Code(简称 VS Code / VSC) 是一款免费开源的现代化轻量级代码编辑器,支持几乎所有主流的开发语言的语法高亮.智能代码补全.自定义热键.括号匹配.代 ...

  8. mutex,thread(c++11 windows linux三种方式)

    一 c++11  windows linux三种方式 //#include <stdio.h> //#include <stdlib.h> //#include <uni ...

  9. c++ 珊格迷宫问题

    #demo1 #include<iostream> #include<ctime> #include<cstdlib> #include<queue> ...

  10. C++标准库分析总结(三)——<迭代器设计原则>

    本节主要总结迭代器的设计原则,以及iterstor traits的设计作用 1.迭代器遵循的原则 迭代器是算法和容器的桥梁,它是类模板的设计,迭代器必须有能力回答算法提出的问题才能去搭配该算法的使用 ...