You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

656 lines
25 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 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<HomePage>
with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin {
int _currentIndicator = 0;
ScrollController? _scrollController;
List<dynamic>? data;
late EasyRefreshController _refreshController;
int page = 1;
int commentCount = 0;
int sysCount = 0;
int sum = 0;
int _currentSwiperIndex = 0;
// ActivityItemModel? _activityItemModel;
List<HomeActivityModel> _activityItemModels = [];
List<HomeAnnounceModel> _boardItemModels = [];
List<HomeSwiperModel> _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<AppProvider>(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<SystemUiOverlayStyle>(
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<Color> 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,
);
});
}
}