import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/logistics.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/custom_image.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:huixiang/view_widget/no_data_view.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; class LogisticsInformationPage extends StatefulWidget { final arguments; LogisticsInformationPage({this.arguments}); @override State createState() { return _LogisticsInformationPage(); } } class _LogisticsInformationPage extends State { ApiService apiService; RefreshController _refreshController; @override void initState() { super.initState(); _refreshController = RefreshController(); SharedPreferences.getInstance().then((value) { apiService = ApiService(Dio(), context: context, token: value.getString("token")); if((widget.arguments["shipperCode"]??"") != "" && (widget.arguments["logisticsNum"]??"") != "") getShippingTrace(widget.arguments["shipperCode"] ?? "", widget.arguments["logisticsNum"] ?? ""); else queryAppShippingTrace(widget.arguments["orderId"]); }); } List logistics = []; String shipStatus = ""; getShippingTrace(String shipperCode, String logisticCode) async { BaseData baseData = await apiService .shippingTrace(shipperCode, logisticCode) .catchError((error) { _refreshController.refreshFailed(); }); if (baseData != null && baseData.isSuccess) { Logistics lgs = baseData.data; logistics.clear(); logistics.addAll(lgs.traces.reversed); setState(() { shipStatus = logisticsStatus(lgs.state); if (logistics.length > 0) logistics[0].acceptStation += shipStatus; _refreshController.refreshCompleted(); }); } else { _refreshController.refreshFailed(); } } queryAppShippingTrace(orderId) async { BaseData baseData = await apiService.getAppShippingTrace(orderId).catchError((error) { _refreshController.refreshFailed(); }); if (baseData != null && baseData.isSuccess) { Logistics lgs = baseData.data; logistics.clear(); logistics.addAll(lgs.traces.reversed); setState(() { shipStatus = logisticsStatus(lgs.state); widget.arguments["logisticsName"] = lgs.shipperCode; widget.arguments["logisticsNum"] = lgs.logisticCode; if (logistics.length > 0) logistics[0].acceptStation += shipStatus; _refreshController.refreshCompleted(); }); } else { _refreshController.refreshFailed(); } } @override Widget build(BuildContext context) { return Scaffold( appBar: MyAppBar( background: Color(0xFFF7F7F7), title: S.of(context).wuliuxinxi, titleColor: Colors.black, leadingColor: Colors.black, ), body: Container( child: SingleChildScrollView( physics: BouncingScrollPhysics(), child: Column( children: [ _orderInformation(), SizedBox( height: 16.h, ), Container( margin: EdgeInsets.symmetric( vertical: 8.h, horizontal: 16.w, ), padding: EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.vertical( top: Radius.circular(8.w), bottom: Radius.circular(4.w), ), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 2), blurRadius: 14, spreadRadius: 0, ) ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.only(bottom: 32.h), child: Text( S.of(context).dingdangenzong, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.bold, color: Color(0xff353535)), ), ), Container( child: (logistics != null && logistics.length > 0) ? ListView.builder( itemCount: logistics != null ? logistics.length : 0, shrinkWrap: true, physics: NeverScrollableScrollPhysics(), itemBuilder: (context, position) { return orderTrackItem(logistics[position], position, logistics.length); }) : NoDataView( src: "assets/image/icon_empty.png", isShowBtn: false, text: "暂无物流信息~", fontSize: 16.sp, margin: EdgeInsets.only(top: 120), ), ), ]), ), ], ), ), ), ); } Widget _orderInformation() { return Container( margin: EdgeInsets.only(left: 16.w, right: 16.w), padding: EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(4), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 2), blurRadius: 14, spreadRadius: 0, ) ], ), child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( alignment: Alignment.bottomCenter, children: [ MImage( widget.arguments["skuImg"] != null ? widget.arguments["skuImg"] : "", width: 95, height: 95, fit: BoxFit.cover, errorSrc: "assets/image/default_1.png", fadeSrc: "assets/image/default_1.png", ), Container( padding: EdgeInsets.only( left: 32.w, right: 32.w, top: 5.h, bottom: 5.h), decoration: BoxDecoration( borderRadius: BorderRadius.only( topLeft: Radius.circular(0), bottomLeft: Radius.circular(4), topRight: Radius.circular(0), bottomRight: Radius.circular(4), ), color: Color(0x53000000), ), child: Text.rich( TextSpan( children: [ TextSpan( text: S.of(context).gong, style: TextStyle( fontSize: 12.sp, fontWeight: FontWeight.w400, color: Colors.white, ), ), TextSpan( text: widget.arguments["productNum"].toString() ?? "", style: TextStyle( fontSize: 12.sp, fontWeight: FontWeight.w400, color: Colors.white, ), ), TextSpan( text: S.of(context).jian, style: TextStyle( fontSize: 12.sp, fontWeight: FontWeight.w400, color: Colors.white, ), ), ], ), ), ), ], ), SizedBox( width: 12.w, ), Expanded( flex: 1, child: Container( height: 95.h, child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Text( S.of(context).wuliuzhuangtai, style: TextStyle( color: Color(0xff353535), fontSize: 14.sp, fontWeight: FontWeight.w400), ), Text( shipStatus, style: TextStyle( color: Color(0xFF32A060), fontSize: 14.sp, fontWeight: FontWeight.bold), ) ], ), SizedBox( height: 8.h, ), Row( children: [ Text( S.of(context).wuliugongsi, style: TextStyle( color: Color(0xff353535), fontSize: 14.sp, ), ), Text( widget.arguments["logisticsName"] ?? "", style: TextStyle( color: Colors.black, fontSize: 14.sp, fontWeight: FontWeight.w400), ) ], ), SizedBox( height: 8.h, ), Row( children: [ Text( S.of(context).wuliudanhao, style: TextStyle( color: Color(0xff353535), fontSize: 14.sp, fontWeight: FontWeight.w400), ), Text( widget.arguments["logisticsNum"] ?? "", style: TextStyle( color: Colors.black, fontSize: 14.sp, fontWeight: FontWeight.w400), ) ], ), ], ), ), ) ], ), ], ), ); } Widget orderTrackItem(TracesBean logistics, var position, var size) { return Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ Column( // mainAxisAlignment: MainAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( logistics.acceptTime.split(" ")[0], style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.medium, color: Color(0xff353535)), ), SizedBox( height: 5.h, ), Text( logistics.acceptTime.split(" ")[1], style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.medium, color: Color(0xff868686)), ), ], ), SizedBox( width: 28.w, ), Column( children: [ Image.asset( tripStatus(logistics.acceptStation), width: 24.w, height: 24.h, ), if (position != size - 1) Container( width: 1.w, height: 75.h, decoration: new BoxDecoration( color: Color(0xffE1E1E1), ), ) ], ), SizedBox( width: 28.w, ), Expanded( flex: 1, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (logisticsTripStatus(logistics.acceptStation) != "") Text( logisticsTripStatus(logistics.acceptStation), style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.medium, color: Colors.black), ), SizedBox( height: 10.h, ), Text( logistics.acceptStation, style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.regular, color: Color(0xff353535)), ), ], ), ), ], ); } String logisticsStatus(state) { String logisticsStatus = ""; switch (state) { case 2: logisticsStatus = "运输中"; break; case 3: logisticsStatus = "已签收"; break; case 4: logisticsStatus = "问题件"; break; } return logisticsStatus; } String tripStatus(String type) { String tripStatus = "assets/image/icon_sign.png"; if (type.contains("已签收")) { tripStatus = "assets/image/icon_sign.png"; } else if (type.contains("派送中") || type.contains("派件中")) { tripStatus = "assets/image/icon_delivery.png"; } else if (type.contains("运输中") || type.contains("发往")) { tripStatus = "assets/image/icon_transport.png"; } else if (type.contains("已发货") || type.contains("分配")) { tripStatus = "assets/image/icon_deliver_goods.png"; } else if (type.contains("已下单")) { tripStatus = "assets/image/icon_place_ order.png"; } return tripStatus; } String logisticsTripStatus(String state) { String logisticsTripStatus = ""; if (state.contains("已签收")) { logisticsTripStatus = "已签收"; } else if (state.contains("派送中") || state.contains("派件中")) { logisticsTripStatus = "派送中"; } else if (state.contains("运输中") || state.contains("发往")) { logisticsTripStatus = "运输中"; } else if (state.contains("已发货") || state.contains("分配")) { logisticsTripStatus = "已发货"; } else if (state.contains("已下单")) { logisticsTripStatus = "已下单"; } return logisticsTripStatus; } }