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.

684 lines
29 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.

// Flutter imports:
import 'dart:async';
// Project imports:
import 'package:aku_community_manager/const/api.dart';
import 'package:aku_community_manager/const/resource.dart';
import 'package:aku_community_manager/models/announce/announcement_list_model.dart';
import 'package:aku_community_manager/models/manager/bussiness_and_fix/bussiness_and_fix_model.dart';
import 'package:aku_community_manager/models/manager/item_num_model.dart';
import 'package:aku_community_manager/models/todo_bussiness/todo_model.dart';
import 'package:aku_community_manager/models/todo_bussiness/todo_outdoor_model.dart';
import 'package:aku_community_manager/provider/app_provider.dart';
import 'package:aku_community_manager/provider/message_provider.dart';
import 'package:aku_community_manager/provider/user_provider.dart';
import 'package:aku_community_manager/style/app_style.dart';
import 'package:aku_community_manager/tools/screen_tool.dart';
import 'package:aku_community_manager/tools/user_tool.dart';
import 'package:aku_community_manager/tools/widget_tool.dart';
import 'package:aku_community_manager/ui/home/announcement/All_anouncement.dart';
import 'package:aku_community_manager/ui/home/application/applications_page.dart';
import 'package:aku_community_manager/ui/home/business/business_page.dart';
import 'package:aku_community_manager/ui/home/business/bussiness_func.dart';
import 'package:aku_community_manager/ui/home/business/todo_outdoor_card.dart';
import 'package:aku_community_manager/ui/home/messages/message.dart';
import 'package:aku_community_manager/ui/home/personal_draw.dart';
import 'package:aku_community_manager/ui/home/search_workorder_page.dart';
import 'package:aku_community_manager/ui/login/login_page.dart';
import 'package:aku_community_manager/ui/settings/user_info_page.dart';
import 'package:aku_community_manager/ui/sub_pages/business_and_fix/business_and_fix_page.dart';
import 'package:aku_community_manager/ui/sub_pages/business_and_fix/business_fix_card.dart';
import 'package:aku_community_manager/ui/sub_pages/visitor_manager/visitor_manager_page.dart';
import 'package:aku_community_manager/ui/tool_pages/warning/warning_page.dart';
import 'package:aku_community_manager/ui/widgets/app_widgets/aku_avatar.dart';
import 'package:aku_community_manager/ui/widgets/common/aku_button.dart';
import 'package:aku_community_manager/ui/widgets/common/aku_material_button.dart';
import 'package:aku_community_manager/utils/network/base_list_model.dart';
import 'package:aku_community_manager/utils/network/net_util.dart';
import 'package:aku_community_manager/utils/websocket/web_socket_util.dart';
// Package imports:
import 'package:badges/badges.dart';
import 'package:bot_toast/bot_toast.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart' hide Response;
import 'package:provider/provider.dart';
class HomePage extends StatefulWidget {
HomePage({
Key? key,
}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
late ItemNumModel _itemNumModel;
List? _todoModelList;
late List _anounceMentList;
bool _onload = true;
EasyRefreshController? _refreshController;
DateTime? _lastPressed;
///自定义bar的菜单按钮
Widget _menuButton(String assetPath, String text, Widget page) {
final appProvider = Provider.of<AppProvider>(context);
return Expanded(
child: AkuButton(
radius: 8.w,
height: 75.w + 8.w + 33.w,
onPressed: () {
final userProvider =
Provider.of<UserProvider>(context, listen: false);
if (userProvider.isLogin) {
Get.to(() => page);
if (text != '全部应用')
appProvider.addRecentApp(AppApplication(text, assetPath, page));
} else
Get.to(() => LoginPage());
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
assetPath,
height: 60.w,
width: 60.w,
),
SizedBox(height: 8.w),
Text(
text,
style: TextStyle(
color: Color(0xFF4A4B51),
fontSize: 24.sp,
fontWeight: FontWeight.bold,
),
)
],
),
),
);
}
///底部信息栏卡片
Widget _card(
int? number,
String text,
Color color,
int index,
) {
return AkuButton(
radius: 8.w,
onPressed: () {
Get.to(BusinessPage(initIndex: index));
},
color: Color(0xFFFFFFFF),
child: Container(
width: 342.5.w,
height: 166.w,
alignment: Alignment.center,
child: Column(
children: [
SizedBox(
height: 32.w,
),
Text(
number == null ? '0' : number.toString(),
style: TextStyle(
color: color,
fontSize: 40.sp,
fontFamily: 'Bebas',
),
),
SizedBox(
height: 16.w,
),
Text(text,
style: TextStyle(
color: AppStyle.minorTextColor,
fontSize: 24.sp,
fontWeight: FontWeight.bold)),
Spacer(),
],
)),
);
}
@override
void initState() {
super.initState();
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
));
_refreshController = EasyRefreshController();
}
int _currentIndicator = 0;
Future _getItemNum() async {
Response response = await NetUtil().dio!.get(API.manage.findItemNum);
return ItemNumModel.fromJson(response.data);
}
Future _getAnouncement() async {
BaseListModel baseListModel =
(await NetUtil().getList(API.message.announcementList, params: {
"pageNum": 1,
"size": 3,
}));
List<AnnouncementListModel> anounceModels = baseListModel.tableList!
.map((e) => AnnouncementListModel.fromJson(e))
.toList();
return anounceModels;
}
@override
Widget build(BuildContext context) {
final userProvider = Provider.of<UserProvider>(context);
final messageProvider = Provider.of<MessageProvider>(Get.context!);
var loadingWidget = Center(
// child: CircularProgressIndicator(),
);
return AnnotatedRegion<SystemUiOverlayStyle>(
child: Scaffold(
drawer: PersonalDraw(),
backgroundColor: Color(0xFFF9F9F9),
//自定义bar
appBar: PreferredSize(
preferredSize: Size(375.w, 430.w - 40.w + statusBarHeight),
child: Container(
height: 430.w - 40.w + ScreenUtil().statusBarHeight,
width: double.infinity,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Color(0xFFFFDC6F),
Color(0xFFFFC40C),
],
),
borderRadius:
BorderRadius.only(bottomRight: Radius.circular(32.w)),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: ScreenUtil().statusBarHeight),
Container(
height: 88.w,
child: Row(children: [
SizedBox(
width: 16.w,
),
Container(
margin: EdgeInsets.only(top: 8.w, bottom: 8.w),
width: 72.w,
height: 72.w,
clipBehavior: Clip.antiAlias,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(36.w),
),
//头像按钮
child: Builder(
builder: (BuildContext context) {
return GestureDetector(
onTap: () {
Scaffold.of(context).openDrawer();
},
child: AkuAvatar(),
);
},
),
),
SizedBox(width: 16.w),
Expanded(
child: Container(
margin: EdgeInsets.only(top: 8.w, bottom: 8.w),
alignment: Alignment.center,
height: 72.w,
child: AkuButton(
//搜索框按钮
color: Color(0xFFFFFFFF),
onPressed: () {
Get.to(() => SearchWorkOrderPage());
},
radius: 8.w,
child: Row(children: [
AkuBox.w(21.w),
Container(
child: Column(
children: [
SizedBox(height: 18.w),
Image.asset(R.ASSETS_HOME_IC_SEARCH_PNG,
width: 37.w, height: 37.w),
],
),
),
SizedBox(width: 19.w),
Text(
'搜索应用',
style: TextStyle(
color: AppStyle.minorTextColor,
fontSize: 28.sp,
),
),
]),
),
),
),
SizedBox(width: 15.w),
// Container(
// margin: EdgeInsets.only(top: 5.w, bottom: 5.w),
// child: MaterialButton(
// materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
// //扫一扫按钮
// height: double.infinity,
// minWidth: 78.w,
// padding: EdgeInsets.zero,
// onPressed: () {
// Get.to(() => ScanPage());
// },
// child: Column(children: [
// Image.asset(
// R.ASSETS_HOME_IC_SCAN_PNG,
// height: 48.w,
// width: 48.w,
// ),
// Text(
// '扫一扫',
// style: TextStyle(
// color: AppStyle.primaryTextColor,
// fontSize: 20.sp,
// fontWeight: FontWeight.normal,
// ),
// ),
// ]),
// ),
// ),
Badge(
elevation: 0,
position: BadgePosition.topEnd(
top: 4,
end: 4,
),
showBadge: messageProvider.hasMessage,
child: Container(
margin: EdgeInsets.only(top: 5.w, bottom: 5.w),
child: AkuMaterialButton(
minWidth: 78.w,
//消息按钮
height: double.infinity,
onPressed: () {
if (userProvider.isLogin)
Get.to(() => Message());
else
Get.to(() => LoginPage());
},
child: Column(children: [
Image.asset(
R.ASSETS_HOME_IC_NEWS_PNG,
height: 48.w,
width: 48.w,
),
Text(
'消息',
style: TextStyle(
color: AppStyle.primaryTextColor,
fontSize: 20.sp,
),
),
]),
),
),
),
SizedBox(width: 17.w),
]),
),
SizedBox(height: 24.w),
GestureDetector(
onTap: () {
if (!userProvider.isLogin)
Get.to(() => LoginPage());
else
Get.to(() => UserInfoPage());
},
child: Container(
margin: EdgeInsets.only(
left: 32.w,
),
height: 67.w,
child: Text(
userProvider.isLogin
? 'HI${userProvider.infoModel!.nickName}'
: '登录/注册',
style: TextStyle(
color: AppStyle.primaryTextColor,
fontWeight: FontWeight.bold,
fontSize: 48.sp,
),
),
),
),
SizedBox(height: 16.w),
Container(
margin: EdgeInsets.only(left: 32.w, right: 32.w),
width: double.infinity,
height: 163.w,
decoration: BoxDecoration(
color: Color(0xFFFFFFFF),
borderRadius: BorderRadius.circular(8.w),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
_menuButton(
R.ASSETS_HOME_IC_POLICE_PNG, '一键报警', WarningPage()),
_menuButton(
R.ASSETS_HOME_IC_VISITORS_PNG,
'访客管理',
VisitorManagerPage(),
),
_menuButton(
R.ASSETS_HOME_IC_SERVICE_PNG,
'报事报修',
BusinessAndFixPage(),
),
_menuButton(
R.ASSETS_HOME_IC_ALL_PNG, '全部应用', ApplicationPage()),
],
),
),
],
),
),
),
//需要重构
body: WillPopScope(
onWillPop: () async {
if (_lastPressed == null ||
DateTime.now().difference(_lastPressed!) >
Duration(seconds: 1)) {
//两次点击间隔超过1秒重新计算
_lastPressed = DateTime.now();
BotToast.showText(text: '再点击一次返回退出');
return false;
}
//否则关闭app
WebSocketUtil().closeWebSocket();
return true;
},
child: EasyRefresh(
firstRefresh: true,
header: MaterialHeader(),
controller: _refreshController,
onRefresh: () async {
final userProvider =
Provider.of<UserProvider>(context, listen: false);
if (userProvider.isLogin) {
_itemNumModel = await _getItemNum();
var dataList = await BussinessFunc.getBussinessModelList(1);
_todoModelList =
dataList.map((e) => ToDoModel.fromJson(e)).toList();
_anounceMentList = await _getAnouncement();
_onload = false;
setState(() {});
}
},
child: (!UserTool.userProvider.isLogin)
? SizedBox()
: _onload
? loadingWidget
: ListView(
padding: EdgeInsets.all(32.w),
children: [
Container(
//公告标题行
width: double.infinity,
height: 45.w,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'今日公告',
style: TextStyle(
color: Color(0xFF4A4B51),
fontSize: 32.sp,
fontWeight: FontWeight.bold,
),
),
Spacer(),
AkuButton(
//全部公告按钮
onPressed: () {
Get.to(() => AllAnouncement());
},
child: Row(
children: [
Text(
'全部公告',
style: TextStyle(
color: AppStyle.minorTextColor,
fontSize: 24.sp,
fontWeight: FontWeight.bold,
),
),
Icon(
Icons.arrow_forward_ios,
size: 22.w,
color: AppStyle.minorTextColor,
)
],
),
),
],
),
),
SizedBox(height: 16.w),
//公告栏
Container(
color: Color(0xFFFFFFFF),
width: double.infinity,
height: 172.w,
child: Stack(children: [
CarouselSlider(
items: _anounceMentList
.map((e) =>
AllAnouncementState.anounceCard(e))
.toList(),
options: CarouselOptions(
viewportFraction: 1.0,
aspectRatio: 686 / 172,
autoPlay: true,
onPageChanged: (index, _) {
setState(() {
_currentIndicator = index;
});
},
),
),
Positioned(
top: 144.w,
left: 0,
bottom: 16.w,
right: 0,
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: _anounceMentList.map((e) {
int index = _anounceMentList.indexOf(e);
return Container(
width: 12.w,
height: 12.w,
margin: EdgeInsets.symmetric(
horizontal: 12.w),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: _currentIndicator == index
? Color(0xFFFFC40C)
: Color(0xFFE8E8E8),
),
);
}).toList(),
),
),
]),
),
SizedBox(height: 16.w),
//待办事项标题行
!userProvider.isLogin
? SizedBox()
: Row(
children: [
Text(
'待办事项',
style: TextStyle(
color: Color(0xFF4A4B51),
fontSize: 32.sp,
fontWeight: FontWeight.bold,
),
),
Spacer(),
AkuButton(
padding:
EdgeInsets.symmetric(vertical: 16.w),
onPressed: () {
Get.to(BusinessPage(initIndex: 3));
},
child: Row(
children: [
Text(
'全部事项',
style: TextStyle(
color: AppStyle.minorTextColor,
fontSize: 24.sp,
fontWeight: FontWeight.bold),
),
Icon(
Icons.arrow_forward_ios,
size: 22.w,
color: AppStyle.minorTextColor,
),
],
),
),
],
),
SizedBox(height: 16.w),
//待办事项栏
!userProvider.isLogin
? SizedBox()
: Container(
height: 453.w,
child: ListView.separated(
padding: EdgeInsets.zero,
separatorBuilder: (context, index) {
return AkuBox.w(16);
},
scrollDirection: Axis.horizontal,
itemBuilder: (context, index) {
return Container(
width: 526.w,
child: Builder(
builder: (context) {
if (_todoModelList![index]
.dynamicModel
.runtimeType ==
BussinessAndFixModel) {
return BusinessFixCard(
homeDisplay: true,
callRefresh: () {
_refreshController!
.callRefresh();
},
model: _todoModelList![index]
.dynamicModel);
} else if (_todoModelList![index]
.dynamicModel
.runtimeType ==
ToDoOutDoorModel) {
return ToDoOutDoorCard(
homeDisplay: true,
callRefresh: () {
_refreshController!
.callRefresh();
},
model: _todoModelList![index]
.dynamicModel,
);
} else
return SizedBox();
},
),
);
},
itemCount: _todoModelList!.length,
),
),
SizedBox(height: 24.w),
//底部信息栏
!userProvider.isLogin
? SizedBox()
: Container(
width: double.infinity,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8.w),
color: Colors.white,
),
child: Column(
children: [
Row(
children: [
_card(
_itemNumModel.unProcessedNum ?? 0,
'未处理事项',
Color(0xFFFF4E0D),
0),
GridientDiveder()
.verticalDivider(166.5.w),
_card(
_itemNumModel.processingNum ?? 0,
'处理中事项',
Color(0xFFFFC40C),
1),
],
),
Row(children: [
GridientDiveder()
.horizontalDivider(343.w),
GridientDiveder(isReverse: true)
.horizontalDivider(343.w)
]),
Row(
children: [
_card(_itemNumModel.processedNum ?? 0,
'已处理事项', Color(0xFF3F8FFE), 2),
GridientDiveder(isReverse: true)
.verticalDivider(
166.5.w,
),
_card(_itemNumModel.allNum ?? 0,
'全部事项', Color(0xFF333333), 3),
],
),
],
),
),
],
),
),
),
),
value: SystemUiOverlayStyle.dark,
);
}
}