// Dart imports: import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:badges/badges.dart'; import 'package:bot_toast/bot_toast.dart'; import 'package:card_swiper/card_swiper.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:get/get.dart'; import 'package:jpush_flutter/jpush_flutter.dart'; import 'package:power_logger/power_logger.dart'; import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:aku_new_community/constants/application_objects.dart'; import 'package:aku_new_community/extensions/color_ext.dart'; import 'package:aku_new_community/gen/assets.gen.dart'; import 'package:aku_new_community/models/home/home_activity_model.dart'; import 'package:aku_new_community/models/home/home_announce_model.dart'; import 'package:aku_new_community/models/home/home_swiper_model.dart'; import 'package:aku_new_community/pages/message_center_page/message_center_page.dart'; import 'package:aku_new_community/pages/one_alarm/widget/alarm_page.dart'; import 'package:aku_new_community/provider/app_provider.dart'; import 'package:aku_new_community/ui/community/activity/activity_card.dart'; import 'package:aku_new_community/ui/community/activity/activity_detail_page.dart'; import 'package:aku_new_community/ui/community/activity/activity_list_page.dart'; import 'package:aku_new_community/ui/community/community_func.dart'; import 'package:aku_new_community/ui/community/notice/notice_detail_page.dart'; import 'package:aku_new_community/ui/home/home_notification.dart'; import 'package:aku_new_community/ui/home/home_title.dart'; import 'package:aku_new_community/ui/home/public_infomation/public_information_detail_page.dart'; import 'package:aku_new_community/ui/market/search/good_detail_page.dart'; import 'package:aku_new_community/utils/headers.dart'; import 'package:aku_new_community/utils/login_util.dart'; import 'package:aku_new_community/widget/bee_divider.dart'; import 'package:aku_new_community/widget/bee_image_network.dart'; import 'package:aku_new_community/widget/others/rectIndicator.dart'; import 'package:aku_new_community/widget/others/user_tool.dart'; import 'package:aku_new_community/widget/views/bee_gradient_divider.dart'; import '../../ui/manager/advice/advice_page.dart'; class HomePage extends StatefulWidget { HomePage({Key? key}) : super(key: key); @override _HomePageState createState() => _HomePageState(); } class _HomePageState extends State with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin { int _currentIndicator = 0; ScrollController? _scrollController; List? data; late EasyRefreshController _refreshController; int page = 1; int commentCount = 0; int sysCount = 0; int sum = 0; int _currentSwiperIndex = 0; // ActivityItemModel? _activityItemModel; List _activityItemModels = []; List _boardItemModels = []; List _swiperModels = []; SwiperController _swiperController = SwiperController(); @override void initState() { super.initState(); if (UserTool.userProvider.isLogin) { try { JPush().setAlias(UserTool.userProvider.userInfoModel!.id.toString()); LoggerData.addData( 'setAlias ${UserTool.userProvider.userInfoModel!.id} ${DateTime.now()}'); } catch (e) { LoggerData.addData('${e.toString()} ${DateTime.now()}'); } } _scrollController = ScrollController(); _refreshController = EasyRefreshController(); SystemChrome.setSystemUIOverlayStyle( SystemUiOverlayStyle(statusBarColor: Colors.transparent)); } @override void dispose() { _refreshController.dispose(); _scrollController?.dispose(); _swiperController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { super.build(context); AppProvider appProvider = Provider.of(context); commentCount = appProvider.messageCenterModel.commentCount ?? 0; sysCount = appProvider.messageCenterModel.sysCount ?? 0; sum = commentCount + sysCount; var head = Padding( padding: EdgeInsets.only( top: MediaQuery.of(context).padding.top + 20.w, right: 32.w, left: 32.w, bottom: 20.w), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ // if (appProvider.location != null) Image.asset( Assets.home.icLocation.path, width: 48.w, height: 48.w, ), 16.wb, Text( '${UserTool.userProvider.userInfoModel?.communityName ?? ""}', // appProvider.location?['city'] == null // ? '' // : appProvider.location?['city'] as String? ?? '', style: TextStyle( fontWeight: FontWeight.w600, fontSize: 28.sp, color: Color(0xff333333), ), textAlign: TextAlign.center, ), // Text( // '(${appProvider.weatherType} ${appProvider.weatherTemp}℃)', // style: TextStyle( // fontSize: 28.sp, // color: Color(0xff999999), // ), // textAlign: TextAlign.center, // ), Spacer(), // GestureDetector( // onTap: () { // Get.to(() => BeeSearch()); // }, // child: // Image.asset(Assets.home.icSearch.path, height: 48.w, width: 48.w), // ), 20.wb, Badge( elevation: 0, badgeColor: Color(0xFFCF2525), padding: sum > 9 ? EdgeInsets.all(2.w) : EdgeInsets.all(5.w), showBadge: appProvider.messageCenterModel.commentCount != 0 || appProvider.messageCenterModel.sysCount != 0, position: BadgePosition.topEnd( top: 8.w, end: -4.w, ), badgeContent: Text( (sum > 99 ? 99 : sum).toString(), style: TextStyle(color: Colors.white, fontSize: 20.sp), ), child: GestureDetector( onTap: () { if (LoginUtil.isNotLogin) return; Get.to(() => MessageCenterPage()); }, child: Image.asset(Assets.home.icMessage.path, height: 48.w, width: 48.w), ), ), ], ), ); return AnnotatedRegion( value: SystemUiOverlayStyle.dark, child: Scaffold( extendBody: true, extendBodyBehindAppBar: true, backgroundColor: Color(0xFFFDE019), appBar: PreferredSize( preferredSize: Size.fromHeight(MediaQuery.of(context).padding.top + 88.w), child: head), body: SafeArea( child: Container( height: MediaQuery.of(context).size.height, decoration: BoxDecoration( borderRadius: BorderRadius.vertical(top: Radius.circular(32.w)), color: Color(0xFFF9F9F9)), clipBehavior: Clip.antiAliasWithSaveLayer, child: EasyRefresh( controller: _refreshController, header: MaterialHeader(), firstRefresh: true, onRefresh: () async { _activityItemModels = await CommunityFunc.activityList(); _boardItemModels = await CommunityFunc.board(); _swiperModels = await CommunityFunc.swiper(); appProvider.getMessageCenter(); setState(() {}); }, child: CustomScrollView( shrinkWrap: true, controller: _scrollController, slivers: [ SliverToBoxAdapter( child: HomeSwiper(), ), SliverToBoxAdapter( child: Container( margin: EdgeInsets.symmetric(horizontal: 32.w), padding: EdgeInsets.only(top: 20.w, left: 0.w, right: 0.w), child: _applications(), //ApplicationView(), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16.w), ), ), ), SliverToBoxAdapter( child: Container( width: 686.w, height: 320.w, clipBehavior: Clip.antiAliasWithSaveLayer, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16.w)), margin: EdgeInsets.all(32.w), child: Row( children: [ Expanded( flex: 2, child: GestureDetector( child: Container( padding: EdgeInsets.only(left: 34.w, top: 40.w), decoration: BoxDecoration( borderRadius: BorderRadius.circular(16.w), image: DecorationImage( fit: BoxFit.fill, image: AssetImage( Assets.home.imgFkyq.path), )), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '访客邀请', style: TextStyle( color: Color(0xD9000000), fontSize: 28.sp, fontWeight: FontWeight.bold), ), 10.hb, Text( '让拜访更加便捷', style: TextStyle( color: Color(0x73000000), fontSize: 20.sp, ), ), ], ), ), onTap: () async { BotToast.showText( text: '本小区尚未配置门禁设备', align: Alignment(0, 0.5)); //Get.to(() => VisitorAccessPage()); }, ), ), BeeGradientDivider.vertical(), Expanded( flex: 3, child: Column( children: [ Expanded( flex: 1, child: GestureDetector( child: Container( width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(16.w), image: DecorationImage( fit: BoxFit.cover, image: AssetImage( Assets.home.imgYjbj.path), )), padding: EdgeInsets.only( left: 32.w, top: 40.w), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '一键报警', style: TextStyle( color: Color(0xD9000000), fontSize: 28.sp, fontWeight: FontWeight.bold), ), 10.hb, Text( '提交报警位置给物业', style: TextStyle( color: Color(0x73000000), fontSize: 20.sp, ), ), ], ), ), onTap: () { Get.to(() => AlarmPage()); }, ), ), BeeGradientDivider.horizontal(), Expanded( flex: 1, child: GestureDetector( child: Container( padding: EdgeInsets.only( top: 40.w, left: 32.w), width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(16.w), image: DecorationImage( fit: BoxFit.cover, image: AssetImage( Assets.home.imgJyzx.path), )), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( '建议咨询', style: TextStyle( color: Color(0xD9000000), fontSize: 28.sp, fontWeight: FontWeight.bold), ), 10.hb, Text( '欢迎给我们提供服务意见', style: TextStyle( color: Color(0x73000000), fontSize: 20.sp, ), ), ], ), ), onTap: () async { Get.to(AdvicePage( type: AdviceType.SUGGESTION)); }, ), ) ], ), ) ], ), ), ), SliverToBoxAdapter( child: Container( padding: EdgeInsets.all(32.w), margin: EdgeInsets.symmetric(horizontal: 32.w), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16.w)), child: Column( children: [ HomeTitle( title: '社区活动', suffixTitle: '查看全部', onTap: () => Get.to(() => ActivityListPage()), ), _activityItemModels == [] ? SizedBox() : Container( height: 450.w, child: ListView.separated( padding: EdgeInsets.zero, separatorBuilder: (context, index) { return SizedBox( width: 16.w, ); }, scrollDirection: Axis.horizontal, itemBuilder: (context, index) { return Container( width: 500.w, child: Builder( builder: (context) { return ActivityCard( home: true, model: _activityItemModels[index]); }, ), ); }, itemCount: _activityItemModels.length, ), ), // : ActivityCard(model: _activityItemModel) // .pSymmetric(h: 24.w, v: 24.w), ], ), )), SliverToBoxAdapter( child: 48.hb, ), ], ), ), ), ), )); } Widget HomeSwiper() { return Container( width: double.infinity, clipBehavior: Clip.antiAlias, margin: EdgeInsets.all(32.w), height: 248.w, decoration: BoxDecoration(borderRadius: BorderRadius.circular(16.w)), child: Swiper( key: UniqueKey(), controller: _swiperController, onIndexChanged: (index) async { _currentSwiperIndex = index; }, itemBuilder: (BuildContext context, int index) { return getSwiperImage(_swiperModels[index]); }, pagination: SwiperPagination( alignment: Alignment.bottomRight, builder: SwiperCustomPagination( builder: (BuildContext context, SwiperPluginConfig config) { return RectIndicator( position: config.activeIndex, count: _swiperModels.length, activeColor: Color(0x99FFFFFF), color: Color(0xD9FFFFFF), //未选中 指示器颜色,选中的颜色key为Color width: 4, //指示器宽度 activeWidth: 14, //选中的指示器宽度 radius: 4, //指示器圆角角度 height: 4, ); //指示器高度 })), scrollDirection: Axis.horizontal, // control: new SwiperControl(), autoplay: true, onTap: (index) { swiperNavigate(_swiperModels[index]); }, itemCount: _swiperModels.length, ), ); } void swiperNavigate(HomeSwiperModel model) { switch (model.type) { case 1: launch(model.customizeUrl ?? ''); break; case 2: model.associationId == null ? null : Get.to(() => GoodDetailPage( goodId: model.associationId!, )); break; case 3: model.associationId == null ? null : Get.to(() => PublicInformationDetailPage( id: model.associationId!, )); break; case 4: model.associationId == null ? null : Get.to(() => NoticeDetailPage( id: model.associationId!, )); break; case 5: model.associationId == null ? null : Get.to(() => ActivityDetailPage( id: model.associationId!, )); break; default: () {}; } } Widget getSwiperImage(HomeSwiperModel swiperModel) { return Container( clipBehavior: Clip.antiAliasWithSaveLayer, decoration: BoxDecoration(borderRadius: BorderRadius.circular(16.w)), child: BeeImageNetwork( imgs: swiperModel.imgList ?? [], ), ); } Widget _applications() { return Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ getFunctionBtn(AO.fromRaw('报事报修')), getFunctionBtn(AO.fromRaw('设施预约')), getFunctionBtn(AO.fromRaw('生活缴费')), getFunctionBtn(AO.fromRaw('活动投票')), ], ), 24.hb, Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ getFunctionBtn(AO.fromRaw('周边服务')), getFunctionBtn(AO.fromRaw('任务发布', replaceTitle: '任务发布')), getFunctionBtn(AO.fromRaw('邻家宠物')), getFunctionBtn(AO.fromRaw('全部应用')), ], ), 44.hb, BeeDivider.horizontal(), 10.hb, HomeNotification(items: _boardItemModels), 10.hb, ], ); } Widget getFunctionBtn(AO ao) { return Expanded( flex: 1, child: GestureDetector( onTap: () { if (LoginUtil.isNotLogin) return; // if (ao.title != '全部应用' && !LoginUtil.haveRealName(ao.title)) return; if (ao.callback == null) { BotToast.showText( text: '该功能正在准备上线中,敬请期待', align: Alignment(0, 0.5)); } else { ao.callback!(); } }, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( ao.path, height: 96.w, width: 96.w, ), 8.hb, ao.title.text.size(24.sp).color(Color(0xFF333333)).make(), ], ), ), ); } @override bool get wantKeepAlive => true; } class BeeBallPauseHeader extends Header { /// Key final Key? key; final ValueNotifier bgColor; final LinkHeaderNotifier linkNotifier = LinkHeaderNotifier(); BeeBallPauseHeader({ this.key, required this.bgColor, bool enableHapticFeedback = true, bool enableInfiniteRefresh = false, }) : super( extent: 70.0, triggerDistance: 70.0, float: false, enableHapticFeedback: enableHapticFeedback, enableInfiniteRefresh: enableInfiniteRefresh, ); @override Widget contentBuilder( BuildContext context, RefreshMode refreshState, double pulledExtent, double refreshTriggerPullDistance, double refreshIndicatorExtent, AxisDirection axisDirection, bool float, Duration? completeDuration, bool enableInfiniteRefresh, bool success, bool noMore) { linkNotifier.contentBuilder( context, refreshState, pulledExtent, refreshTriggerPullDistance, refreshIndicatorExtent, axisDirection, float, completeDuration, enableInfiniteRefresh, success, noMore); return ValueListenableBuilder( valueListenable: bgColor, builder: (context, Color color, child) { return BallPulseHeaderWidget( key: key, color: bgColor.value.complementary, backgroundColor: bgColor.value, linkNotifier: linkNotifier, ); }); } }