import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/vip_card.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/view_widget/classic_header.dart'; import 'package:huixiang/view_widget/custom_image.dart'; import 'package:huixiang/view_widget/my_footer.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'; import 'package:flutter_screenutil/flutter_screenutil.dart'; class VipCardPage extends StatefulWidget { @override State createState() { return _VipCardPage(); } } class _VipCardPage extends State { RefreshController _refreshController; ApiService apiService; @override void initState() { super.initState(); _refreshController = RefreshController(); SharedPreferences.getInstance().then((value) { apiService = ApiService(Dio(), context: context, token: value.getString("token")); queryVipCard(); }); } List coupons = []; queryVipCard() async { BaseData baseData = await apiService.vipList().catchError((error) { _refreshController.refreshFailed(); }); if (baseData != null && baseData.isSuccess) { coupons.clear(); coupons.addAll( (baseData.data as List).map((e) => VipCard.fromMap(e))); setState(() { _refreshController.refreshCompleted(); }); } else { _refreshController.refreshFailed(); } } @override Widget build(BuildContext context) { return Scaffold( body: Container( child: SmartRefresher( enablePullDown: true, enablePullUp: false, header: MyHeader(), footer: CustomFooter( builder: (context, mode) { return MyFooter(mode); }, ), controller: _refreshController, onRefresh: queryVipCard, physics: BouncingScrollPhysics(), child: (coupons != null && coupons.length > 0) ? ListView.builder( padding: EdgeInsets.symmetric(vertical: 8.h), itemBuilder: (context, position) { return GestureDetector( onTap: () { Navigator.of(context).pushNamed('/router/vip_details_page', arguments: {"id": coupons[position].id}); }, child: vipCardItem(coupons[position]), ); }, itemCount: coupons != null ? coupons.length : 0, ) : NoDataView( isShowBtn: false, text: "还没有会员卡~", fontSize: 16.sp, margin: EdgeInsets.only(top: 120.h), ), ), ), ); } String assetsByName(String storeName) { if (storeName == null) return "assets/image/icon_vip_bj.png"; if (storeName.contains("百年川椒")) { return "assets/image/icon_vip_bj.png"; } else if (storeName.contains("海峡姐妹")) { return "assets/image/icon_milk_tea_bg.png"; } else if (storeName.contains("前进麦味")) { return "assets/image/icon_bread_bg.png"; } return "assets/image/icon_vip_bj.png"; } Widget vipCardItem(VipCard vipCard) { return Container( margin: EdgeInsets.fromLTRB(16.w, 8.h, 16.w, 8.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( children: [ Positioned( child: ClipRRect( borderRadius: BorderRadius.circular(8.w), child: Image.asset( assetsByName(vipCard.tenantName), fit: BoxFit.cover, //填充剩余空间 height: 170.h, ), ), top: 0, left: 0, right: 0, bottom: 0, ), Container( padding: EdgeInsets.all(16.w), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ MImage( vipCard.tenantLogo, width: 54.w, height: 54.h, fit: BoxFit.cover, errorSrc: "assets/image/default_1.png", fadeSrc: "assets/image/default_1.png", ), SizedBox( width: 12.w, ), Expanded( child: Container( height: 54.h, child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ Expanded( child: Text( vipCard.tenantName ?? "", overflow: TextOverflow.ellipsis, maxLines: 1, style: TextStyle( fontSize: 20.sp, fontWeight: FontWeight.bold, color: Colors.black, ), ), flex: 1, ), Image.asset( "assets/image/icon_vip.png", ), ], ), Text.rich( TextSpan(children: [ TextSpan( text:S.of(context).huiyuanka, style: TextStyle( fontSize: 12.sp, fontWeight: FontWeight.w500, color: Colors.black, ), ), ]), textDirection: TextDirection.ltr, ), ], ), ), flex: 1, ) ], ), SizedBox(height: 50.h), Row( textDirection: TextDirection.rtl, children: [ Icon( Icons.chevron_right, color: Colors.black, size: 24, ), Text.rich( TextSpan(children: [ TextSpan( text:S.of(context).chakanxiangqing, style: TextStyle( fontSize: 12.sp, fontWeight: FontWeight.bold, color: Colors.black, ), ), ]), ), ], ), SizedBox( height: 10.h, ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ Expanded( flex: 1, child: Text.rich( TextSpan(children: [ TextSpan( text: "No.${vipCard.id}", style: TextStyle( fontSize: 14.sp, fontWeight: FontWeight.w400, color: Colors.black, ), ), ]), ), ), Text.rich( TextSpan(children: [ TextSpan( text: "有效期限:", style: TextStyle( fontSize: 12.sp, fontWeight: FontWeight.w400, color: Color(0Xff353535), ), ), ]), ), Text.rich( TextSpan(children: [ TextSpan( text: "长期有效", style: TextStyle( fontSize: 12.sp, fontWeight: FontWeight.w400, color: Color(0Xff353535), ), ), ]), ), ], ), ], ), ), ], ), ); } }