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( 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,
             ScreenAdapter.width(750),
            height: ScreenAdapter.height(88),
            child: Container(
                padding: EdgeInsets.all(5),
                 ScreenAdapter.width(750),
                height: ScreenAdapter.height(100),
                decoration: BoxDecoration(
                    color: Colors.red,
                    border: Border(
                        top: BorderSide( 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();
  }
}

原文地址:https://www.cnblogs.com/yiweiyihang/p/11566213.html