zoukankan      html  css  js  c++  java
  • 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();
      }
    }

  • 相关阅读:
    ZZNU 1995: cots' times
    网站后缀名都有哪些
    webstorm运行到服务器(Apache)
    window系统下node.js环境配置
    window系统安装node.js
    网站创建自定义百度地图
    响应式一级到三级导航
    H5插入视频兼容各大浏览器
    phpStudy环境安装
    jquery on和bind
  • 原文地址:https://www.cnblogs.com/yiweiyihang/p/11566213.html
Copyright © 2011-2022 走看看