import 'package:barcode_widget/barcode_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:geolocator/geolocator.dart'; import 'package:huixiang/data/store.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/data/base_data.dart'; import 'package:huixiang/data/vip_card.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/store/scan.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/utils/location.dart'; import 'package:huixiang/utils/painter_bg.dart'; import 'package:huixiang/view_widget/custom_image.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:huixiang/view_widget/my_footer.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; class VipDetailPage extends StatefulWidget { final Map? arguments; VipDetailPage({this.arguments}); @override State createState() { return _VipDetailPage(); } } class _VipDetailPage extends State { ApiService? apiService; @override void dispose() { super.dispose(); refreshController.dispose(); LocationInstance.getInstance().stopLocation(); } @override void initState() { super.initState(); vipDetail("", ""); startLocation(); } startLocation() async { // EasyLoading.show(status: S.current.zhengzaijiazai); LocationInstance.getInstance().startLocation(context, (Position? result) { if (result?.latitude != null && result?.longitude != null) { vipDetail(result?.latitude, result?.longitude); } else { EasyLoading.dismiss(); } }).then((value) { if (!value) { EasyLoading.dismiss(); refreshController.refreshFailed(); } }); } VipCard? vipCard; final RefreshController refreshController = RefreshController(); int current = 1; vipDetail(latitude, longitude) async { final SharedPreferences value = await SharedPreferences.getInstance(); BaseData? baseData = await apiService?.vipDetail({ "id": widget.arguments?["id"], "latitude": "$latitude", "longitude": "$longitude", }).catchError((onError) {}); if (baseData?.isSuccess ?? false) { vipCard = baseData!.data; refreshController.loadComplete(); } else { refreshController.loadFailed(); } print("object:object"); setState(() {}); } @override Widget build(BuildContext context) { return Scaffold( appBar: MyAppBar( title: S.of(context).huiyuankaxiangqing, titleColor: Colors.white, background: Color(0xFF3A405A), systemUiOverlayStyle: SystemUiOverlayStyle.dark, leadingColor: Colors.white, ), body: Column( children: [ Stack( children: [ CustomPaint( painter: BgPainter( bgColor: Color(0xFF3A405A), bezierHeight: 30.h, ), child: Container( height: 220.h, ), ), buildVipCard(), ], ), Padding( padding: EdgeInsets.only( left: 16.w, top: 32.h, bottom: 8.h, ), child: Row( children: [ Text( S.of(context).shiyongmendian, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 16.sp, fontWeight: MyFontWeight.semi_bold, color: Colors.black, ), ), SizedBox( width: 8.w, ), Image.asset( "assets/image/icon_shop.webp", ), ], ), ), Expanded( child: SmartRefresher( controller: refreshController, enablePullDown: false, enablePullUp: true, footer: CustomFooter( builder: (context, mode) { return MyFooter(mode); }, ), physics: BouncingScrollPhysics(), child: ListView.builder( itemBuilder: (context, position) { return GestureDetector( onTap: () {}, child: shopItem(vipCard!.storeList![position]), ); }, padding: EdgeInsets.symmetric(vertical: 1), itemCount: vipCard?.storeList?.length ?? 0, ), ), ), ], ), ); } Widget buildVipCard() { return Container( margin: EdgeInsets.fromLTRB(16.w, 8.h, 16.w, 8.h), height: 220.h, decoration: BoxDecoration( borderRadius: BorderRadius.circular(8.w), color: Colors.white, boxShadow: [ BoxShadow( color: Colors.black.withAlpha(12), offset: Offset(0, 3), blurRadius: 14, spreadRadius: 0, ) ], ), child: Stack( // alignment: Alignment.center, children: [ Image.asset( "assets/image/icon_vip_bj.webp", fit: BoxFit.fill, //填充剩余空间 height: 220.h, ), Container( padding: EdgeInsets.all(16.w), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ MImage( vipCard?.storeList?[0].logo ?? "", width: 40, height: 40, radius: BorderRadius.circular(4), fit: BoxFit.cover, errorSrc: "assets/image/default_1.webp", fadeSrc: "assets/image/default_1.webp", ), SizedBox( width: 8.w, ), Expanded( child: Container( height: 54.h, child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ Expanded( child: Text( vipCard?.tenantName ?? "", overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.semi_bold, color: Colors.black, ), ), flex: 1, ), Image.asset( "assets/image/icon_vip.webp", ), ], ), Text.rich( TextSpan( children: [ TextSpan( text: S.of(context).huiyuanka, style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.regular, color: Colors.black, ), ), ], ), textDirection: TextDirection.ltr, ), ], ), ), flex: 1, ) ], ), Expanded( child: Container(), flex: 1, ), Padding( padding: EdgeInsets.only(left: 32.w, right: 32.w), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, children: [ Column( children: [ Text.rich( TextSpan( children: [ TextSpan( text: "¥ ${vipCard?.balance ?? ""}", style: TextStyle( fontSize: 24.sp, fontWeight: MyFontWeight.medium, color: Colors.black, ), ), ], ), ), GestureDetector( onTap: () { Navigator.of(context).pushNamed( '/router/vip_balance', arguments: {"storeId": vipCard?.id}, ); }, child: Row( children: [ Text.rich( TextSpan( children: [ TextSpan( text: S.of(context).yue, style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.semi_bold, color: Colors.black, ), ), ], ), ), Icon( Icons.keyboard_arrow_right, color: Colors.black, size: 22.5, ), ], ), ), ], ), Column( children: [ Text.rich( TextSpan( children: [ TextSpan( text: "0", style: TextStyle( fontSize: 24.sp, fontWeight: MyFontWeight.medium, color: Colors.black, ), ), ], ), ), SizedBox( height: 5.h, ), Text.rich( TextSpan( children: [ TextSpan( text: S.of(context).jifen, style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.semi_bold, color: Colors.black, ), ), ], ), ), ], ), ], ), ), Column( children: [ Padding( padding: EdgeInsets.only( top: 5.h, bottom: 5.h, ), child: Text( vipCard != null ? "${vipCard!.id?.substring(0, 4)} " "${vipCard!.id?.substring(4, 8)} " "${vipCard!.id?.substring(8, 12)} " "${vipCard!.id?.substring(12, 16)} " "${vipCard!.id?.substring(16, vipCard!.id?.length)}" : "", maxLines: 1, textAlign: TextAlign.center, style: TextStyle( color: Colors.black, fontSize: 14.sp, wordSpacing: vipCard == null ? 10 : (MediaQuery.of(context).size.width - 64.w) / (((vipCard?.id?.length ?? 0) * 4)), letterSpacing: vipCard == null ? 8 : (MediaQuery.of(context).size.width - 64.w) / (((vipCard?.id?.length ?? 0) * 4)), ), ), ), BarcodeWidget( barcode: Barcode.code128(), data: vipCard?.id ?? "", height: 30.h, color: Colors.black, drawText: false, ), ], ) ], ), ), ], ), ); } Widget shopItem(Store store) { return Container( margin: EdgeInsets.symmetric( horizontal: 16.w, vertical: 8.h, ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Expanded( flex: 1, child: Text( store.storeName ?? "", style: TextStyle( fontSize: 14.sp, fontWeight: MyFontWeight.semi_bold, color: Colors.black, ), ), ), GestureDetector( onTap: () { // Navigator.of(context).pushNamed('/router/union_detail_page', // arguments: {"id": store.id}); if(store.posType?.code == "NORMALSTORE") { Scan.toScan( context, store.id, store.tenantCode, store.storeName, ); } else { Navigator.of(context).pushNamed( '/router/store_order', arguments: { "id": store.id, "tenant": store.tenantCode, "storeName": store.storeName }, ); } }, child: Text( S.of(context).chakan, style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.medium, color: Color(0xff32A060), ), ), ), Icon( Icons.chevron_right, color: Color(0xff32A060), size: 16, ), ], ), SizedBox( height: 8.h, ), Row( children: [ Text( "${S.of(context).dizhi}: ", style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.regular, color: Color(0xff353535), ), ), Expanded( child: Text( store.address ?? "", overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.regular, color: Color(0xff353535), ), ), flex: 1, ) ], ), SizedBox( height: 4.h, ), Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ Expanded( flex: 1, child: Text( S.of(context).yingyeshijian((store.openStartTime == null && store.openEndTime == null) ? S.of(context).quantian : "${store.openStartTime!.substring(0, store.openStartTime!.lastIndexOf(":"))} - ${store.openEndTime!.substring(0, store.openEndTime!.lastIndexOf(":"))}"), style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.regular, color: Color(0xff353535), ), ), ), 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( fontSize: 12.sp, fontWeight: MyFontWeight.regular, color: Color(0xff868686), ), ), ], ), ], ), ); } bool isRemake = true; // String totalPrice(orderInfo) { // if (orderInfo == null) return ""; // double totalPrice = ((double.tryParse(orderInfo.orderSum) ?? 0) + (double.tryParse(orderInfo.postFee) ?? 0)); // if (orderInfo.orderDetail != null && // orderInfo.orderDetail.couponDTO != null) { // totalPrice -= (double.tryParse(orderInfo.orderDetail.couponDTO.money) ?? 0); // } // return "$totalPrice"; // } // List goodsItem(List products) { // if (products.length > 3) { // products = products.sublist(0, 3); // } // return products // .map( // (e) => Container( // margin: EdgeInsets.symmetric(horizontal: 2.w), // child: Column( // mainAxisAlignment: MainAxisAlignment.spaceAround, // crossAxisAlignment: CrossAxisAlignment.center, // children: [ // MImage( // e.skuImg, // width: 75.w, // height: 75.h, // fit: BoxFit.contain, // errorSrc: "assets/image/default_1.webp", // fadeSrc: "assets/image/default_1.webp", // ), // SizedBox( // height: 4.h, // ), // if (isRemake) // Container( // width: 75.w, // child: Text( // e.productName, // maxLines: 1, // textAlign: TextAlign.center, // overflow: TextOverflow.ellipsis, // style: TextStyle( // fontSize: 10.sp, // fontWeight: MyFontWeight.regular, // color: Color(0xFF353535), // ), // ), // ), // ], // ), // ), // ) // .toList(); // } }