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: 10), JdText( text: "收货人电话", onChanged: (value) { this.phone = value; }, ), SizedBox(height: 10), Container( padding: EdgeInsets.only(left: 5), height: ScreenAdapter.height(68), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 1, color: Colors.black12))), child: InkWell( child: Row( children: <Widget>[ Icon(Icons.add_location), this.area.length > 0 ? 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: 10), JdText( text: "详细地址", maxLines: 4, height: 200, onChanged: (value) { this.address = "${this.area} ${value}"; }, ), SizedBox(height: 10), 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: 40), 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[0]["salt"] }; var sign=SignServices.getSign(tempJson); // print(sign); var api="${Config.domain}api/addAddress"; var result=await Dio().post(api,data:{ "uid":userinfo[0]["_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[0]['_id'], "salt": userinfo[0]['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'] == 1) { return Column( children: <Widget>[ SizedBox(height: 20), 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: 10), Text("${this.addressList[index]["address"]}") ]), trailing: Icon(Icons.edit, color: Colors.blue), ) ], ); } else { return Column( children: <Widget>[ SizedBox(height: 20), ListTile( title: Column( crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ Text( "${this.addressList[index]["name"]} ${this.addressList[index]["phone"]}"), SizedBox(height: 10), Text("${this.addressList[index]["address"]}") ]), trailing: Icon(Icons.edit, color: Colors.blue), ) ], ); } }, ) ], ), Positioned( bottom: 0, width: ScreenAdapter.width(750), height: ScreenAdapter.height(88), child: Container( padding: EdgeInsets.all(5), width: ScreenAdapter.width(750), height: ScreenAdapter.height(100), decoration: BoxDecoration( color: Colors.red, border: Border( top: BorderSide(width: 1, 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=0;i<attrKeys.length;i++){ str+="${attrKeys[i]}${json[attrKeys[i]]}"; } return md5.convert(utf8.encode(str)).toString(); } }