import 'package:flutter/material.dart'; import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/data/store.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/custom_image.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shimmer/shimmer.dart'; import '../data/base_data.dart'; import '../data/product_show.dart'; import '../retrofit/retrofit_api.dart'; import '../utils/flutter_utils.dart'; import '../view_widget/classic_header.dart'; import '../view_widget/no_data_view.dart'; import '../view_widget/round_button.dart'; class UnionList extends StatefulWidget { final String serviceType; final BMFCoordinate? latLng; final String? searchKey; final String? city; UnionList(Key key, this.serviceType, this.latLng, this.searchKey, this.city) : super(key: key); @override State createState() { return _UnionList(); } } class _UnionList extends State with AutomaticKeepAliveClientMixin { ApiService? apiService; List? storeList; BMFCoordinate? latLng; final RefreshController _refreshController = RefreshController(); int networkStatus = 0; @override bool get wantKeepAlive => true; @override void initState() { super.initState(); queryStore(); } queryStore() async { BaseData>? baseData = await apiService?.queryStore({ "city": (widget.city ?? "") == "所有门店" ? "" : (widget.city ?? ""), // "district": district, // "province": province, "latitude": (widget.latLng?.latitude ?? "").toString(), "longitude": (widget.latLng?.longitude ?? "").toString(), if (widget.searchKey != "") "searchKey": widget.searchKey, "serviceType": widget.serviceType, "exchange": false, }).catchError((error) { SmartDialog.showToast(AppUtils.dioErrorTypeToString(error.type), alignment: Alignment.center); networkStatus = -1; _refreshController.refreshFailed(); }); if (baseData?.isSuccess ?? false) { storeList = baseData!.data; _refreshController.refreshCompleted(); networkStatus = 1; } else { _refreshController.refreshFailed(); SmartDialog.showToast(baseData?.msg ?? "", alignment: Alignment.center); } EasyLoading.dismiss(); if (!mounted) return; setState(() {}); } @override Widget build(BuildContext context) { return SmartRefresher( controller: _refreshController, enablePullDown: true, enablePullUp: false, header: MyHeader( color: Colors.white, ), physics: BouncingScrollPhysics(), onRefresh: queryStore, child: networkStatus == 0 ? ListView.builder( itemCount: 10, physics: BouncingScrollPhysics(), shrinkWrap: true, itemBuilder: (context, position) { return GestureDetector( onTap: () {}, child: buildStoreItemSm(), ); }, ) : ((storeList?.isEmpty ?? true) ? NoDataView( src: "assets/image/di_zhi.webp", isShowBtn: false, text: ((widget.city ?? "") != "武汉" && (widget.city ?? "") != "郑州" && (widget.city ?? "") != "北京") ? " 当前海峡姐妹开放门店 仅包含 武汉/北京/郑州,您当前的位置无法获取,请手动更换城市" : "暂无店铺列表~", fontSize: 16.sp, margin: EdgeInsets.only(top: 120.h, left: 45.w, right: 45.w), ) : ListView.builder( itemCount: storeList!.length, padding: EdgeInsets.only( top: 8.h, bottom: 100.h, ), itemBuilder: (context, position) { return InkWell( onTap: () { { // if (storeList[position].storeName == "一心回乡商城") { // Navigator.of(context).pushNamed( // '/router/shopping_mall_home', // arguments: { // "type": 0, // "id": storeList[position].id, // "tenant": storeList[position].tenantCode, // "storeName":storeList[position].storeName // }, // ); // } // else Navigator.of(context).pushNamed( '/router/store_order', arguments: { "id": storeList![position].id, "tenant": storeList![position].tenantCode, "storeName": storeList![position].storeName, "distance": storeList![position].distance }, ); } }, child: buildStoreItem(storeList![position], position), ); }, )), ); } Widget buildStoreItemSm() { return Container( margin: EdgeInsets.fromLTRB(16.w, 8.h, 16.w, 12.h), padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 12.h), width: double.infinity, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(6)), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(25), offset: Offset(0, 1), blurRadius: 12, spreadRadius: 0, ) ]), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Shimmer.fromColors( baseColor: Color(0XFFD8D8D8), highlightColor: Color(0XFFD8D8D8), child: Container( color: Color(0XFFD8D8D8), width: double.infinity, height: 140.h, ), ), Padding( padding: EdgeInsets.only(left: 6.w, bottom: 5.h, top: 12.h), child: Shimmer.fromColors( baseColor: Color(0XFFD8D8D8), highlightColor: Color(0XFFD8D8D8), child: Container( decoration: BoxDecoration( color: Color(0XFFD8D8D8), borderRadius: BorderRadius.circular(2), ), width: 108.w, height: 20.h, ), ), ), Padding( padding: EdgeInsets.only( left: 6.w, ), child: Shimmer.fromColors( baseColor: Color(0XFFD8D8D8), highlightColor: Color(0XFFD8D8D8), child: Container( decoration: BoxDecoration( color: Color(0XFFD8D8D8), borderRadius: BorderRadius.circular(2), ), width: 260.w, height: 20.h, ), ), ), ], ), ); } Widget buildStoreItem(Store store, position) { return Container( margin: EdgeInsets.fromLTRB( 16.w, 8.h, 16.w, 12.h, ), padding: EdgeInsets.symmetric( horizontal: 12.w, vertical: 12.h, ), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.all( Radius.circular(6), ), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(25), offset: Offset(0, 1), blurRadius: 12, spreadRadius: 0, ) ], ), width: double.infinity, child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack( children: [ MImage( store.facade ?? '', width: 74.h, height: 74.h, fit: BoxFit.cover, radius: BorderRadius.circular(6), errorSrc: "assets/image/default_1.webp", fadeSrc: "assets/image/default_1.webp", ), Container( decoration: BoxDecoration( color: Color(0xFF32A060), borderRadius: BorderRadius.only( topLeft: Radius.circular(6), bottomRight: Radius.circular(6), topRight: Radius.circular(2), bottomLeft: Radius.circular(2), ), ), padding: EdgeInsets.symmetric( horizontal: 3.w, vertical: 2.h, ), child: Text( "品牌", style: TextStyle( color: Colors.white, fontSize: 10.sp, fontWeight: MyFontWeight.regular, ), ), ) ], ), SizedBox( width: 12.w, ), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( store.storeName ?? "", overflow: TextOverflow.ellipsis, style: TextStyle( color: Color(0xFF0D0D0D), fontSize: 14.sp, fontWeight: MyFontWeight.bold, ), ), SizedBox(height: 6.h), Row( children: [ Text( S.of(context).ren( store.perCapitaConsumption ?? "", ), style: TextStyle( color: Color(0xFF4D4D4D), fontSize: 12.sp, fontWeight: MyFontWeight.regular, ), ), SizedBox(width: 22.w), Image.asset( "assets/image/icon_union_location_black.webp", fit: BoxFit.fill, height: 12, width: 12, ), SizedBox(width: 4.w), Text( (store.distance ?? 0) > 1000 ? S.of(context).gongli( ((store.distance ?? 0) / 1000 * 100).toInt() / 100.0) : S.of(context).mi( ((store.distance ?? 0) * 100).toInt() / 100.0), style: TextStyle( color: Color(0xFF4D4D4D), fontSize: 12.sp, ), ), ], ), SizedBox(height: 10.h), Row( children: []..addAll(itemServer(store.businessService ?? "")), ), SizedBox(height: store.businessService == "" ? 40.h : 23.h), Container( height: 100.h, child: ListView.builder( padding: EdgeInsets.zero, itemCount: (storeList![position].productShow?.length ?? 0) > 3 ? 3 : storeList![position].productShow?.length ?? 0, scrollDirection: Axis.horizontal, shrinkWrap: true, physics: BouncingScrollPhysics(), itemBuilder: (context, index) { return GestureDetector( onTap: () {}, child: unionGoodsItem( storeList![position].productShow![index]), ); }, ), ), ], ), ), ], ), ); } ///标签 List itemServer(String businessService) { if (businessService == "") return []; var list = businessService.split(","); return list .map((e) => Container( margin: EdgeInsets.only(right: 8.w), child: RoundButton( height: 17.h * AppUtils.textScale(context), text: "$e", backgroup: Color(0xFFF65720), padding: EdgeInsets.only( left: 4.w, right: 4.w, ), fontSize: 10.sp, textColor: Colors.white, ), )) .toList(); } Widget unionGoodsItem(ProductShow productShow) { return Container( width: 74.h, margin: EdgeInsets.only(right: 8.w), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, children: [ MImage( productShow.imgs?[0] ?? "", width: 74.h, height: 74.h, fit: BoxFit.cover, radius: BorderRadius.circular(4), errorSrc: "assets/image/default_1.webp", fadeSrc: "assets/image/default_1.webp", ), Padding( padding: EdgeInsets.only(top: 8.h), child: Text( productShow.productName ?? "", overflow: TextOverflow.ellipsis, style: TextStyle( color: Color(0xFFA29E9E), fontSize: 12.sp, fontWeight: MyFontWeight.regular, ), ), ), ], ), ); } //旧ui Widget buildStoreItems(Store store, position) { return Container( margin: EdgeInsets.fromLTRB(16.w, 8.h, 16.w, 12.h), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(8)), boxShadow: [ BoxShadow( color: Colors.black.withAlpha(25), offset: Offset(0, 1), blurRadius: 12, spreadRadius: 0, ) ]), width: double.infinity, height: 235.h, child: Stack( children: [ Positioned( top: 0, left: 0, right: 0, child: ClipRRect( child: MImage( store.facade ?? "", width: double.infinity, height: 140.h, fit: BoxFit.cover, errorSrc: "assets/image/default_1.webp", fadeSrc: "assets/image/default_1.webp", ), borderRadius: BorderRadius.vertical( top: Radius.circular(4), ), ), ), Positioned( bottom: 0, left: 0, right: 0, child: Container(), ), Positioned( bottom: 16.h, left: 12.w, right: 12.w, child: Container( height: 107.h, child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ MImage( store.logo ?? "", width: 57, height: 57, fit: BoxFit.cover, isCircle: true, errorSrc: "assets/image/default_1.webp", fadeSrc: "assets/image/default_1.webp", ), SizedBox( width: 6.w, ), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( height: 40.h, ), Text( store.storeName ?? "", overflow: TextOverflow.ellipsis, style: TextStyle( color: Color(0xFF0D0D0D), fontSize: 14.sp, fontWeight: MyFontWeight.bold, ), ), SizedBox( height: 5.h, ), Expanded( child: Text( "${S.of(context).dizhi}:${store.address}", maxLines: 2, overflow: TextOverflow.ellipsis, style: TextStyle( color: Color(0xFF4D4D4D), fontSize: 12.sp, fontWeight: MyFontWeight.regular, ), ), ) ], )), Container( width: 59.w, height: 18.h, alignment: Alignment.center, margin: EdgeInsets.only(top: 20.h), decoration: BoxDecoration( borderRadius: BorderRadius.circular(2), color: Color(0xFF32A060), ), child: Visibility( child: Text( (store.distance ?? 0) > 1000 ? S.of(context).gongli( ((store.distance ?? 0) / 1000 * 100).toInt() / 100.0) : S.of(context).mi( ((store.distance ?? 0) * 100).toInt() / 100.0), style: TextStyle( color: Color(0xFFFFFFFF), fontSize: 10.sp, ), ), visible: store.distance != null, ), ), ], ), ), ), ], ), ); } }