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:functional_widget_annotation/functional_widget_annotation.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:school_asignment_app/common/job/work_student.dart'; import 'package:school_asignment_app/common/store/app_storage_key.dart'; import 'package:school_asignment_app/common/utils/storage.dart'; import 'package:school_asignment_app/common/utils/utils.dart'; import 'package:school_asignment_app/page/global_widget/MyEmptyWidget.dart'; import 'package:school_asignment_app/page/global_widget/global_scaffold.dart'; import 'package:school_asignment_app/page/global_widget/my_text.dart'; import 'package:school_asignment_app/page/home_page/widget/task_list_item.dart'; import 'package:school_asignment_app/page/home_page/widget/top_user_info.dart'; import 'package:school_asignment_app/routes/app_pages.dart'; import 'home_logic.dart'; class HomePage extends StatefulWidget { const HomePage({Key? key}) : super(key: key); @override State createState() => _HomePageState(); } class _HomePageState extends State { final logic = Get.find(); final state = Get .find() .state; @override Widget build(BuildContext context) { return GlobalScaffold( active: state.active, body: AnnotatedRegion( value: const SystemUiOverlayStyle( systemNavigationBarColor: Color(0xFF000000), systemNavigationBarDividerColor: null, statusBarColor: Colors.white, systemNavigationBarIconBrightness: Brightness.light, statusBarIconBrightness: Brightness.dark, statusBarBrightness: Brightness.light, ), child: Scaffold( backgroundColor: const Color.fromRGBO(244, 244, 244, 1), body: OrientationBuilder( builder: (BuildContext context, Orientation orientation) { return Column( children: [ Container( color: Colors.white, margin: EdgeInsets.only(top: MediaQuery .of(context) .padding .top), padding: EdgeInsets.only(bottom: 9.h, top: 4.h), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ const Expanded(flex: 1, child: SizedBox()), Expanded( flex: 4, child: Container( padding: EdgeInsets.symmetric(vertical: 2.h), alignment: Alignment.center, decoration: BoxDecoration( color: const Color.fromRGBO(243, 243, 243, 1), borderRadius: BorderRadius.circular(8.r), ), child: TabBar( padding: EdgeInsets.zero, indicatorPadding: EdgeInsets.zero, indicatorWeight: 0, labelPadding: EdgeInsets.symmetric( horizontal: 2.w), controller: logic.tabController, unselectedLabelStyle: TextStyle( fontSize: 14.sp, color: const Color.fromRGBO(69, 83, 100, 1), ), labelStyle: TextStyle( fontSize: 14.sp, color: const Color.fromRGBO(104, 136, 253, 1), ), // labelColor: const Color.fromRGBO(45, 56, 76, 1), indicator: const BoxDecoration(), onTap: (index) { state.tabIndex.value = index; if (index == 1 && state.completedToRefresh) { // 已阅卷 // _refreshController2.callRefresh(); state.completedToRefresh = false; } logic.getList(); }, tabs: [ Tab( iconMargin: EdgeInsets.zero, height: 34.h, child: Obx(() { return Container( width: 140.w, alignment: Alignment.center, decoration: BoxDecoration( color: state.tabIndex.value == 0 ? const Color.fromRGBO( 255, 255, 255, 1) : null, borderRadius: BorderRadius.all( Radius.circular(8.r)), ), child: quickText( '待批阅', size: 14.sp, color: state.tabIndex.value == 0 ? Theme .of(context) .primaryColor : const Color.fromRGBO( 80, 94, 110, 1), fontWeight: state.tabIndex.value == 0 ? FontWeight.bold : null, ), ); }), ), Tab( iconMargin: EdgeInsets.zero, height: 34.h, child: Obx(() { return Container( width: 140.w, alignment: Alignment.center, decoration: BoxDecoration( color: state.tabIndex.value == 1 ? const Color.fromRGBO( 255, 255, 255, 1) : null, borderRadius: BorderRadius.all( Radius.circular(8.r)), ), child: quickText( '已批阅', size: 14.sp, color: state.tabIndex.value == 1 ? Theme .of(context) .primaryColor : const Color.fromRGBO( 80, 94, 110, 1), fontWeight: state.tabIndex.value == 1 ? FontWeight .bold : null, ), ); }), ), ], ), ), ), Expanded( flex: 1, child: InkWell( onTap: () { /* RouterManager.router .navigateTo( context, RouterManager.jobStudentGroupPath, transition: getTransition());*/ }, child: Icon( const IconData( 0xe63e, fontFamily: "AlibabaIcon"), color: const Color.fromRGBO(44, 48, 63, 1), size: 24.sp), ), ), ], ), ), /* if (state.tabIndex.value == 1) $CompletedJobConditionFilter( controller: _tabController2, jobType: params2.markingType ?? 1, customTime: _tabController2.index != 3 || (params2.startTime == null && params2.endTime == null) ? null : PickerDateRange( params2.startTime == null ? null : DateTime.parse( params2.startTime!), params2.endTime == null ? null : DateTime.parse(params2 .endTime!), ), onJobTypeTap: (int jobTypeVal) { params2.markingType = jobTypeVal; _refreshController2.callRefresh(); }, onTimeFilter: (String? startTime, String? endTime) { if (startTime == null && endTime == null && _tabController2.index == 3) { _tabController2.animateTo(0); } params2.endTime = endTime; params2.startTime = startTime; _refreshController2.callRefresh(); }, ),*/ Expanded( child: IndexedStack( index: state.tabIndex.value, children: [ $easyRefresh( controller: logic.refreshController1, tab: 1, type: state.active, data: state.workList, onLoad: logic.onMyLoad, onRefresh: logic.onMyRefresh, logic: logic ), $easyRefresh( controller: logic.refreshController2, tab: 2, type: state.active, data: state.workList, onLoad: logic.onMyLoad, onRefresh: logic.onMyRefresh, logic: logic ), ], ) ), ], ); }, ), ), ), ); } @override void dispose() { Get.delete(); super.dispose(); } } /// 已阅卷 /// OnRefreshCallback? onRefresh /// @swidget Widget $easyRefresh({ required EasyRefreshController controller, required Future< void> Function(EasyRefreshController controller, int tab) onRefresh, required Future< void> Function(EasyRefreshController controller, int tab) onLoad, required List data, required int tab, required int type, required HomeLogic logic, }) { bool completed = tab == 2; // 是否是待批阅 bool isPadFlag = Utils.isPad(); return Obx(() { return EasyRefresh( firstRefresh: false, taskIndependence: true, /*enableControlFinishLoad: true, enableControlFinishRefresh: true,*/ emptyWidget: data.isEmpty ? const MyEmptyWidget() : null, controller: controller, header: MaterialHeader(), footer: TaurusFooter(), child: completed && isPadFlag ? GridView( padding: EdgeInsets.only( top: 11.h, bottom: 10.h, left: 12.w, right: 12.w), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, //横轴三个子widget mainAxisSpacing: 10.h, crossAxisSpacing: 6.w, childAspectRatio: 1.81 //宽高比为1时,子widget ), children: List.generate(data.length, (index) { Items item = data[index]; String subjectName = logic.formatSubject(item.subject); return $reviewedItem(jobTaskItem: item,type: type,subjectName:subjectName); }), ) : ListView.builder( padding: EdgeInsets.only(top: 11.h, bottom: 10.h, left: 12.w, right: 12.w), itemBuilder: (context, index) { Items item = data[index]; return TaskListItem(completed:completed,jobTaskItem:item,type:type,logic: logic,); /*HomeworkTasksViewItem( completed: completed, jobTaskItem: data[index], call: () => controller.callRefresh(), );*/ }, itemCount: data.length, ), onRefresh: () => onRefresh(controller, tab), onLoad: () => onLoad(controller, tab), ); }); } @swidget Widget $reviewedItem({ required Items jobTaskItem, required int type,required String subjectName}) { EdgeInsets padEdg = EdgeInsets.symmetric(horizontal: 10.w); return InkWell( onTap: () { /* String url = '${RouterManager.jobListParticipateInClassPath}?&jobId=${jobTaskItem.id}&genderName=${Uri.encodeComponent(jobTaskItem.genderName)}&jobName=${Uri.encodeComponent(jobTaskItem.title)}&completed=${true}'; RouterManager.router.navigateTo(context, url, transition: getTransition());*/ }, child: Container( padding: EdgeInsets.only(top: 10.h), decoration: BoxDecoration( borderRadius: BorderRadius.circular(6.r), color: Colors.white, boxShadow: const [ BoxShadow( color: Color.fromRGBO(210, 216, 241, 1), offset: Offset.zero, //阴影y轴偏移量 blurRadius: 5.8, //阴影模糊程度 spreadRadius: 0, //阴影扩散程度 ) ], ), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ // 顶部任务名称 Padding( padding: padEdg, child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: 32.w, height: 18.h, alignment: Alignment.center, padding: EdgeInsets.only(left: 2.w), decoration: BoxDecoration( color: type == 1 ? const Color.fromRGBO(104, 136, 253, 1) : const Color.fromRGBO(255, 175, 56, 1), borderRadius: BorderRadius.only( topLeft: Radius.circular(14.r), topRight: Radius.circular(3.r), bottomLeft: Radius.circular(4.r), bottomRight: Radius.circular(4.r), ), ), margin: EdgeInsets.only(right: 4.w), child: quickText(type == 1 ? '作业' : '考试', color: Colors.white, size: 10.sp), ), Expanded( child: quickText(jobTaskItem.name, size: 14.sp, color: const Color.fromRGBO(70, 70, 70, 1), maxLines: 2), ) ], ), ), Padding( padding: padEdg, child: Row( crossAxisAlignment: CrossAxisAlignment.end, children: [ quickText( jobTaskItem.publishTime.substring(0, 10), color: const Color.fromRGBO(97, 97, 97, 1), size: 10.sp, fontWeight: FontWeight.w500, ), quickText(' / ', color: const Color.fromRGBO(76, 199, 147, 1), size: 10.sp, fontWeight: FontWeight.w500), quickText( '参与班级:', color: const Color.fromRGBO(76, 199, 147, 1), size: 9.sp, ), quickText( '${jobTaskItem.classCount}', color: const Color.fromRGBO(76, 199, 147, 1), size: 10.sp, ), quickText(' / ', color: const Color.fromRGBO(116, 145, 253, 1), size: 10.sp, fontWeight: FontWeight.w500), quickText( '科目:$subjectName', color: const Color.fromRGBO(116, 145, 253, 1), size: 9.sp, ), ], ), ), /*Padding( padding: EdgeInsets.symmetric(horizontal: 10.w), child: FavoriteButton( jobTaskItem.id, jobTaskItem.title, margin: EdgeInsets.only(top: 4.h, bottom: 6.h), ), ),*/ GestureDetector( onTap: () { /* RouterManager.router.navigateTo( context, RouterManager.jobReportPagePath + '?title=${Uri.encodeComponent(jobTaskItem.title)}&id=${jobTaskItem.id}', transition: getTransition(), );*/ }, child: Container( padding: EdgeInsets.symmetric(vertical: 6.h), decoration: BoxDecoration( borderRadius: BorderRadius.only( bottomLeft: Radius.circular(6.r), bottomRight: Radius.circular(6.r)), color: Colors.white, boxShadow: const [ BoxShadow( color: Color.fromRGBO(0, 0, 0, 0.15), offset: Offset(0, -0.0001), //阴影y轴偏移量 blurRadius: 4, //阴影模糊程度 spreadRadius: 0, //阴影扩散程度 ) ], ), child: Row(children: [ Expanded( child: Container( alignment: Alignment.center, child: quickText( '查看报告', color: const Color.fromRGBO(118, 118, 118, 1), size: 11.sp), ), ), ]), ), ), ], ), ), ); }