import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_swiper/flutter_swiper.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/retrofit/data/activity.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/findMiNiGroupList.dart'; import 'package:huixiang/retrofit/data/miNiDetail.dart'; import 'package:huixiang/retrofit/data/shoppingCart.dart'; import 'package:huixiang/retrofit/data/store_info.dart'; import 'package:huixiang/retrofit/min_api.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/store/store_view/product_sku.dart'; import 'package:huixiang/store/store_view/shop_car.dart'; import 'package:huixiang/store/store_view/store_activity.dart'; import 'package:huixiang/store/store_view/store_info.dart'; import 'package:huixiang/store/store_view/store_order_list.dart'; import 'package:huixiang/union/union_view/union_coupon.dart'; import 'package:huixiang/union/union_view/vip.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/classic_header.dart'; import 'package:huixiang/view_widget/custom_image.dart'; import 'package:huixiang/view_widget/my_tab.dart'; import 'package:huixiang/view_widget/round_button.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; class StoreOrderPage extends StatefulWidget { final Map arguments; StoreOrderPage({this.arguments}); @override State createState() { return _StoreOrderPage(); } } class _StoreOrderPage extends State with TickerProviderStateMixin, AutomaticKeepAliveClientMixin { TabController tabcontroller; ApiService apiService; MinApiService minService; StoreInfo storeInfo; List activitys; RefreshController refreshController; List _widgetOptions; int allCount = 0; double allPrice = 0; StoreOrderListPage storeOrderListPage; ScrollController controller = ScrollController(); @override void initState() { super.initState(); if (tabcontroller == null) tabcontroller = TabController( length: 2, vsync: this, ); storeOrderListPage = StoreOrderListPage( widget.arguments, activitys, storeInfo, controller, _queryMiNiDetail, _fc ); _widgetOptions = [ storeOrderListPage, ///星店活动, StoreActivity( widget.arguments, activitys, ), ]; minLogin(); queryStoreInfo(); } _fc(ProductListBean plb) { setState(() { allCount = 0; allPrice = 0; bool flag = false; for(var i = 0;i < productLists.length;i++){ if(productLists[i].id == plb.id){ flag = true; if(plb.buyNum == 0) productLists.removeAt(i); else productLists[i] = plb; break; } } storeOrderListPage.notifyList(productLists); if(!flag && plb.buyNum != 0) productLists.add(plb); productLists.forEach((element) { allCount += element.buyNum; allPrice += double.parse(element.price) * element.buyNum; }); }); } /// 小程序登录 minLogin() async { final SharedPreferences value = await SharedPreferences.getInstance(); apiService = ApiService( Dio(), context: context, token: value.getString('token'), ); apiService .minLogin(widget.arguments["id"]) .catchError((onError) {}) .then((baseData) { if (baseData != null && baseData.isSuccess) { Map minStoreInfo = baseData.data; String minToken = minStoreInfo["token"]; String tenant = widget.arguments["tenant"]; SharedPreferences.getInstance().then( (value) => { value.setString('minToken', minToken), value.setString('tenant', tenant), }, ); minService = MinApiService( Dio(), context: context, token: minToken, tenant: tenant, ); } }); } /// 查询店铺信息 queryStoreInfo() async { final SharedPreferences value = await SharedPreferences.getInstance(); apiService = ApiService( Dio(), context: context, token: value.getString('token'), ); BaseData baseData = await apiService .queryStoreInfo(widget.arguments["id"]) .catchError((error) { // refreshController.refreshFailed(); }); if (baseData != null && baseData.isSuccess) { // refreshController.refreshCompleted(); storeInfo = StoreInfo.fromJson(baseData.data); activitys = storeInfo.informationVOPageVO.list .map((e) => Activity.fromJson(e)) .toList(); if (mounted) { setState(() {}); } } } @override Widget build(BuildContext context) { return Stack( children: [ Positioned( left: 0, right: 0, top: 0, bottom: 54.h, child: DefaultTabController( length: 2, child: SmartRefresher( controller: refreshController = RefreshController(initialRefresh: false), enablePullDown: true, enablePullUp: false, header: MyHeader(), physics: BouncingScrollPhysics(), onRefresh: () { queryStoreInfo(); }, child: NestedScrollView( controller: controller, dragStartBehavior: DragStartBehavior.start, headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { return [ SliverOverlapAbsorber( handle: NestedScrollView.sliverOverlapAbsorberHandleFor( context), sliver: SliverAppBar( expandedHeight: (storeInfo != null && storeInfo.couponVOList != null) ? 425.h : 365.h, floating: false, snap: false, pinned: true, stretch: false, leading: GestureDetector( onTap: () { Navigator.of(context).pop(); }, child: Container( alignment: Alignment.centerRight, margin: EdgeInsets.only(left: 10), padding: EdgeInsets.all(6), child: Icon( Icons.arrow_back_ios, color: Colors.black, size: 24, ), ), ), flexibleSpace: FlexibleSpaceBar( title: Title( controller, storeInfo != null ? storeInfo.storeName : '', ), collapseMode: CollapseMode.pin, stretchModes: [ StretchMode.zoomBackground, StretchMode.fadeTitle, StretchMode.blurBackground, ], background: Stack( children: [ Positioned( child: Column( children: [ buildSwiper(), Expanded( child: Container( color: Colors.transparent, ), flex: 1, ), ], ), top: 0, bottom: 0, left: 0, right: 0, ), Positioned( child: Container( child: Column( children: [ ///门店信息 StoreInfoView(storeInfo), ///门店对应优惠券 if (storeInfo != null && storeInfo.couponVOList != null) UnionCoupon( storeInfo, (a) {}, coupon: true, ), ///门店对应VIP信息 Vip(storeInfo, () {}, false), ], ), ), top:100.h, bottom: 0, left: 0, right: 0, ), ], ), ), backgroundColor: Color(0x33FAFAFA), centerTitle: false, elevation: 0, bottom: PreferredSize( preferredSize: Size( MediaQuery.of(context).size.width, 38, ), child: Container( padding: EdgeInsets.symmetric(horizontal: 10.w), width: MediaQuery.of(context).size.width, child: TabBar( controller: tabcontroller, automaticIndicatorColorAdjustment: true, isScrollable: true, indicatorWeight: 1, indicatorColor: Color(0xFFFAFAFA), labelPadding: EdgeInsets.only(left: 8.w, right: 8.w), indicatorSize: TabBarIndicatorSize.label, unselectedLabelStyle: TextStyle( fontSize: 15.sp, fontWeight: FontWeight.w400, ), labelStyle: TextStyle( color: Colors.black, fontSize: 18.sp, fontWeight: FontWeight.bold, ), labelColor: Colors.black, tabs: [ MyTab(text: S.current.diancan), MyTab(text: S.current.xindianhuodong), ], ), ), ), ), ), ]; }, body: TabBarView( physics: BouncingScrollPhysics(), children: _widgetOptions, controller: tabcontroller, ), ), ), ), ), Positioned( bottom: 0, left: 0, right: 0, child: Stack( alignment: Alignment.bottomLeft, children: [ Container( height: 54.h, color: Color(0xFFFAFAFA), child: Row( children: [ Spacer(), Text( S.of(context).heji, style: TextStyle( fontSize: 12.sp, fontWeight: MyFontWeight.regular, color: Colors.black, ), ), Text( "¥" + allPrice.toString(), style: TextStyle( fontSize: 20.sp, fontWeight: MyFontWeight.medium, color: Color(0xFF32A060), ), ), Spacer(), GestureDetector( onTap: () { Navigator.of(context).pushNamed( '/router/settlement', arguments: widget.arguments, ); }, child: RoundButton( width: 103.w, height: 54.h, text: S.current.jiesuan, textColor: Colors.white, fontWeight: MyFontWeight.regular, backgroup: Color(0xFF32A060), radius: 0, fontSize: 16.sp, padding: EdgeInsets.symmetric(vertical: 5.h), ), ), ], ), ), Stack( children: [ InkWell( onTap: () { setState(() { showShoppingCart(); }); }, child: Image.asset( "assets/image/shopp.png", width: 88, height: 88, fit: BoxFit.fitWidth, ), ), Positioned( right: 15, top: 14, child: RoundButton( width: 17, height: 17, text: allCount.toString(), textColor: Colors.white, fontWeight: MyFontWeight.regular, backgroup: Color(0xFF32A060), fontSize: 12.sp, radius: 100, ), ) ], ), ], ), ), ], ); } Widget buildSwiper() { return Container( width: double.infinity, height: 180.h, child: Swiper( pagination: SwiperPagination( alignment: Alignment.bottomCenter, builder: DotSwiperPaginationBuilder( size: 8.w, activeSize: 8.w, space: 5.w, activeColor: Colors.white, color: Colors.white.withAlpha(76), ), ), itemBuilder: (context, position) { return Container( child: MImage( (storeInfo != null && storeInfo.bannerList != null && position < storeInfo.bannerList.length) ? storeInfo.bannerList[position].imgUrl : "", fit: BoxFit.cover, radius: BorderRadius.zero, errorSrc: "assets/image/default_2_1.png", fadeSrc: "assets/image/default_2_1.png", ), ); }, itemCount: (storeInfo != null && storeInfo.bannerList != null) ? storeInfo.bannerList.length : 1, ), ); } List productLists = []; ///购物车弹窗 showShoppingCart() { showModalBottomSheet( context: context, backgroundColor: Colors.transparent, builder: (context) { return ShopCar(productLists, _queryMiNiDetail, _fc); }, ); } ///选规格 _queryMiNiDetail(String id) async { BaseData baseData = await minService.miNiDetail(id); if (baseData != null && baseData.isSuccess) { setState(() { showStoreSelector(baseData.data); }); } } ///选规格弹窗 showStoreSelector(MiNiDetail miNiDetail) { showModalBottomSheet( context: context, backgroundColor: Colors.transparent, builder: (context) { return ProductSku(miNiDetail); }, ); } @override bool get wantKeepAlive => true; } class Title extends StatefulWidget { final ScrollController controller; final String title; Title(this.controller, this.title); @override State createState() { return _Title(); } } class _Title extends State { double alpha = 0; @override void initState() { super.initState(); widget.controller.addListener(() { double maxScrollExtent = widget.controller.position.maxScrollExtent; double alphaHeight = (kToolbarHeight) / 2; double alphaProgress = maxScrollExtent - widget.controller.offset; double alphatemp = 0; if (alphaProgress <= 1) { alphatemp = 1; } else if (alphaProgress <= alphaHeight) { alphatemp = (((alphaHeight - alphaProgress) / alphaHeight) > 0.5) ? 1 : 0; } else { alphatemp = 0; } if (alpha != alphatemp && mounted) { alpha = alphatemp; print("object: $alpha"); setState(() {}); } }); } @override Widget build(BuildContext context) { return Container( margin: EdgeInsets.only(bottom: 38), child: Text( widget.title ?? "", style: TextStyle( color: Colors.black.withOpacity(alpha), fontWeight: FontWeight.bold, fontSize: 18.sp, ), ), ); } }