import 'package:dio/dio.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_swiper/flutter_swiper.dart'; import 'package:huixiang/generated/l10n.dart'; import 'package:huixiang/home/home_view/featured_acticvity.dart'; import 'package:huixiang/home/home_view/home_banner.dart'; import 'package:huixiang/home/home_view/home_integral_store.dart'; import 'package:huixiang/home/home_view/quick_order.dart'; import 'package:huixiang/home/home_view/sign_view.dart'; import 'package:huixiang/home/points_mall_view/points_goods_title.dart'; import 'package:huixiang/home/points_mall_view/points_goods_view.dart'; import 'package:huixiang/main.dart'; import 'package:huixiang/retrofit/data/article.dart'; import 'package:huixiang/retrofit/data/banner.dart'; import 'package:huixiang/retrofit/data/base_data.dart'; import 'package:huixiang/retrofit/data/brand.dart'; import 'package:huixiang/retrofit/data/founder.dart'; import 'package:huixiang/retrofit/data/goods.dart'; import 'package:huixiang/retrofit/data/goods_category.dart'; import 'package:huixiang/retrofit/data/login_info.dart'; import 'package:huixiang/retrofit/data/msg_stats.dart'; import 'package:huixiang/retrofit/data/page.dart'; import 'package:huixiang/retrofit/retrofit_api.dart'; import 'package:huixiang/utils/event_type.dart'; import 'package:huixiang/utils/font_weight.dart'; import 'package:huixiang/view_widget/classic_header.dart'; import 'package:huixiang/view_widget/invite_success_dialog.dart'; import 'package:huixiang/view_widget/my_appbar.dart'; import 'package:huixiang/view_widget/new_people_reward.dart'; import 'package:huixiang/view_widget/request_permission.dart'; import 'package:huixiang/view_widget/round_button.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'home_view/shortcut_operation.dart'; class HomePage extends StatefulWidget { final Function changeTab; final String invite; final List interviewCouponList; final List newUserCouponList; HomePage(this.changeTab, {this.invite, this.interviewCouponList, this.newUserCouponList}); @override State createState() { return _HomePage(); } } class _HomePage extends State with AutomaticKeepAliveClientMixin { ApiService apiService; @override void initState() { super.initState(); eventBus.on().listen((event) { if (event.type < 3) { setState(() {}); } }); if ((widget.invite ?? "") != "" || widget.interviewCouponList != null && widget.interviewCouponList.length > 0) showInvite = true; if (widget.newUserCouponList != null && widget.newUserCouponList.length > 0) showNew = true; } ///邀请成功弹窗 inviteShowAlertDialog(invite, InterviewCouponList interviewCouponList) { //显示对话框 showDialog( context: context, builder: (BuildContext context) { return InviteSuccessDialog(invite, interviewCouponList); }, ); } ///新用户奖励弹窗 newShowAlertDialog(newUserCouponList) { //显示对话框 showDialog( context: context, builder: (BuildContext context) { return NewPeopleReward(newUserCouponList); }, ); } final SwiperController controller = SwiperController(); String categoryId; int pageNum = 1; bool showInvite = false; bool showNew = false; //排序类型枚举:1-自然排序,2-销量,3-价格 int orderType = 1; //是否降序排列 bool orderDesc = true; List goods = []; List gooodsCategorys = []; List bannerData = []; List brandData = []; List
articles = []; List gooods = []; Founder founder; bool isSigned = false; int totalMsg = 0; queryHome() async { EasyLoading.show(status: S.of(context).zhengzaijiazai); final SharedPreferences value = await SharedPreferences.getInstance(); apiService = ApiService(Dio(), context: context, token: value.getString('token'), showLoading: false); final BaseData brand = await apiService.queryHomeBrand().catchError((onError) { refreshController.refreshFailed(); }); if (brand != null && brand.isSuccess) { brandData.clear(); brandData.addAll((brand.data["brandList"] as List) .map((e) => Brand.fromJson(e)) .toList()); founder = Founder.fromJson(brand.data["founder"]); } final BaseData> article = await apiService.queryArticle({ "pageNum": 1, "pageSize": 3, "searchKey": "", "state": 1, "type": 2 }).catchError((onError) { refreshController.refreshFailed(); }); articles.clear(); if (article != null && article.isSuccess) { articles.addAll(article.data.list); } final BaseData> goodsData = await apiService.creditGoods({ "orderDesc": true, "orderType": 1, "pageNum": 1, "pageSize": 10, "state": 1 }).catchError((onError) { refreshController.refreshFailed(); }); if (goodsData != null && goodsData.isSuccess) { gooods.clear(); gooods.addAll(goodsData.data.list); } BaseData> dataCategory = await apiService.goodsCategory({ "current": 1, "map": {}, "model": {"pageNum": 1, "pageSize": 20, "searchKey": ""}, "order": "descending", "size": 20, "sort": "sortOrder" }).catchError((onError) { refreshController.loadFailed(); refreshController.refreshFailed(); }); if (dataCategory != null && dataCategory.isSuccess && dataCategory.data != null && dataCategory.data.records != null && dataCategory.data.records.length > 0) { gooodsCategorys.clear(); gooodsCategorys.add(GoodsCategory(name: S.of(context).quanbu)); gooodsCategorys.addAll(dataCategory.data.records); } var param = { "categoryId": categoryId ?? "", "orderDesc": orderDesc, "orderType": orderType, "pageNum": pageNum, "pageSize": 10, "state": 1 }; BaseData> pageGoods = await apiService.creditGoods(param).catchError((onError) { refreshController.loadFailed(); refreshController.refreshFailed(); }); EasyLoading.dismiss(); if (pageGoods != null && pageGoods.isSuccess) { if (pageNum == 1) { goods.clear(); } goods.addAll(pageGoods.data.list); refreshController.refreshCompleted(); refreshController.loadComplete(); if (pageGoods.data.pageNum == pageGoods.data.pages) { refreshController.loadNoData(); } else { pageNum += 1; } } else { refreshController.loadFailed(); refreshController.refreshFailed(); } final BaseData> baseData = await apiService.queryBanner({ "model": {"type": "HOME_PAGE"}, }).catchError((onError) { refreshController.refreshFailed(); }); if (baseData != null && baseData.isSuccess) { bannerData.clear(); bannerData.addAll(baseData.data.records); refreshController.refreshCompleted(); if (bannerData.length > 0) controller.move(0, animation: false); } else { refreshController.refreshFailed(); } EasyLoading.dismiss(); if (showInvite) { inviteShowAlertDialog(widget.invite, widget.interviewCouponList[0]); showInvite = false; } if (showNew) { newShowAlertDialog(widget.newUserCouponList); showNew = false; } } ///消息数量 queryMsgStats() async { if (apiService == null) { SharedPreferences value = await SharedPreferences.getInstance(); apiService = ApiService( Dio(), context: context, token: value.getString("token"), ); } BaseData> baseData = await apiService.stats().catchError((onError) {}); if (baseData != null && baseData.isSuccess) { setState(() { baseData.data.forEach((element) { totalMsg += element.number; }); }); refreshController.loadComplete(); refreshController.refreshCompleted(); } EasyLoading.dismiss(); } _onRefresh(){ queryHome(); queryMsgStats(); } @override void dispose() { super.dispose(); if (refreshController != null) refreshController.dispose(); } final RefreshController refreshController = RefreshController(); @override Widget build(BuildContext context) { super.build(context); return Column( children: [ MyAppBar( title: "首页", leading: false, actions: [ Container( height: 24, alignment: Alignment.center, margin: EdgeInsets.only( right: 12.w, ), child: GestureDetector( onTap: () { Navigator.of(context).pushNamed('/router/system_msg_page'); }, child: Container( height: 24, alignment:Alignment.center, child:Stack( children: [ SvgPicture.asset( "assets/svg/tixing.svg", width: 24, height: 24, ), if(totalMsg != 0) Container( width:36, alignment: Alignment.topRight, child:Container( width:22, height:14, decoration: BoxDecoration( borderRadius: BorderRadius.circular(100), border: Border.all( width: 1, color: Colors.white, style: BorderStyle.solid, ), color:Color(0xFFFF441A), ), child:RoundButton( text:totalMsg.toString(), textColor: Colors.white, fontWeight: MyFontWeight.regular, backgroup: Color(0xFFFF441A), fontSize:8.sp, radius: 100, ) ), ) ], ), ) ) ), Container( margin: EdgeInsets.only(right: 16.w), child: GestureDetector( onTap: () { toScan(); }, child: SvgPicture.asset( "assets/svg/saoyisao.svg", width: 24, height: 24, ), ), ), ], ), Expanded( child: Container( child: SmartRefresher( controller: refreshController, enablePullDown: true, enablePullUp: false, header: MyHeader(), physics: BouncingScrollPhysics(), onRefresh: () { setState(() {_onRefresh(); }); }, child: SingleChildScrollView( physics: NeverScrollableScrollPhysics(), child: FutureBuilder( future:queryHome(), builder: (context, snapshot) { return Column( children: [ ///banner HomeBanner(bannerData, controller), ///快捷操作 ShortcutOperation(() { widget.changeTab(1); }), ///签到 SignView(isSigned, (value) { setState(() { isSigned = value; }); }), // ///热门文章 // HotArticle(articles), // ///创始人故事 // FounderStore(founder), // ///品牌介绍 // BrandView(brandData), ///店铺推荐 QuickOrder(), ///超级优惠券 // CouponView(), SizedBox( height: 28, ), ///精选活动 FeaturedActivity(), ///积分商城 HomeIntegralStore(gooods), ///积分商品头Tab PointsGoodsTitle( gooodsCategorys, (orderType, orderDesc) { this.orderType = orderType; this.orderDesc = orderDesc; setState(() {}); }, (index) { categoryId = gooodsCategorys[index].id; pageNum = 1; setState(() {}); }, ), ///积分商品列表 PointGoods( goods, (index) { _toDetails(index); }, ), ], ); }, ), ), ), ), ), SizedBox( height: 76.h, ), ], ); } ///扫码 toScan() async { if (await Permission.camera.isPermanentlyDenied) { showCupertinoDialog( context: context, builder: (context) { return RequestPermission( "assets/image/icon_camera_permission_tips.png", S.of(context).ninxiangjiquanxianweikaiqi, S.of(context).weilekaipaizhaoxuanzhetouxiang, S.of(context).kaiqiquanxian, (result) async { if (result) { await openAppSettings(); } }, heightRatioWithWidth: 0.82, ); }); } else if (await Permission.camera.isGranted) { // http://pos.app.gznl.top/placeorder/?tableId=1315903669597634560&tenantCode=1166&shopId=1300372027722432512 var result = await Navigator.of(context).pushNamed('/router/qr_scan'); // String result = await scanner.scan(); Uri uri = Uri.parse(result); String tableId = uri.queryParameters["tableId"]; String tenantCode = uri.queryParameters["tenantCode"]; String shopId = uri.queryParameters["shopId"]; if (tableId != null && tableId != "" && tenantCode != null && tenantCode != "" && shopId != null && shopId != "") { Navigator.of(context).pushNamed( '/router/store_order', arguments: { "id": shopId, "tenant": tenantCode, "storeName": "", "tableId": int.tryParse(tableId), }, ); } } else { showCupertinoDialog( context: context, builder: (context) { return RequestPermission( "assets/image/icon_camera_permission_tips.png", S.of(context).ninxiangjiquanxianweikaiqi, S.of(context).weilekaipaizhaoxuanzhetouxiang, S.of(context).kaiqiquanxian, (result) async { if (result) { await Permission.camera.request(); } }, heightRatioWithWidth: 0.82, ); }); } } _toDetails(index) async { Navigator.of(context).pushNamed( '/router/integral_store_page', arguments: {"goodsId": goods[index].id}, ); } @override bool get wantKeepAlive => true; }