import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:model_of_the_times/icons/material_design_icons.dart'; import 'package:model_of_the_times/requester/requester.dart'; import 'package:model_of_the_times/views/common/data_required.dart'; import 'package:model_of_the_times/views/home/list.dart'; class HomeView extends StatefulWidget { const HomeView({super.key}); @override State createState() => _HomeViewState(); } class _HomeViewState extends State { Widget? lastWidget; late List items; late List functions = []; @override void initState() { super.initState(); functions = [ (context) { return const ModelList(); } ]; items = [ Container( decoration: const BoxDecoration( color: Colors.red ), child: const Padding( padding: EdgeInsetsDirectional.only(top: 4, bottom: 4), child: Text( "学习雷锋同志,弘扬雷锋精神", textAlign: TextAlign.center, style: TextStyle( fontSize: 20, color: Colors.white ), ), ), ), const LoopImage(), const NoticeInformation(), FunctionalCard(onChange: onChange), const Placeholder(), ]; onChange(0); } bool onChange(index) { var func = functions[index]; var ret = func(context); print(func); print(ret); if (ret != null){ setState(() { lastWidget = ret; }); return true; } return false; } @override Widget build(BuildContext context) { if (items.last is! FunctionalCard){ items.removeLast(); } if (lastWidget != null){ items.add(lastWidget!); } return ListView.builder( itemCount: items.length, itemBuilder: (BuildContext context, int index) { return Padding( padding: const EdgeInsetsDirectional.only(start: 10, end: 10), child: items[index], ); }, ); } } class LoopImage extends StatefulWidget { const LoopImage({super.key}); @override State createState() => _LoopImageState(); } class _LoopImageState extends State { int _nowShowedImageIndex = 0; @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsetsDirectional.only(top: 10), child: DataRequired( fetchData: (global) async { var loop = resolve("/appNotice/app-o/loopMap"); var data = await global.requester.get(loop); var dataString = data.body; if (kDebugMode) { print(dataString); } var jsonData = jsonDecode(dataString); return jsonData; }, afterLoading: (data){ var listData = data['data']; List pointers = []; for (var i = 0; i < listData.length; i++){ pointers.add(Container( decoration: BoxDecoration( color: _nowShowedImageIndex == i ? Colors.red : Colors.grey, shape: BoxShape.circle ), width: 10, height: 10, )); } return Flex( direction: Axis.vertical, children: [ SizedBox( height: 200, child: PageView.builder( scrollDirection: Axis.horizontal, itemCount: listData.length, itemBuilder: (BuildContext context, int index){ var itemData = listData[index]; return Image.network(resolve(itemData['picPath']).toString()); }, onPageChanged: (e){ setState(() { _nowShowedImageIndex = e; }); }, ), ), Center( child: Container( width: 50, margin: const EdgeInsetsDirectional.only(top: 10), child: Flex( direction: Axis.horizontal, mainAxisAlignment: MainAxisAlignment.spaceAround, children: pointers, ), ), ) ], ); } ), ); } } class NoticeInformation extends StatefulWidget { const NoticeInformation({super.key}); @override State createState() => _NoticeInformationState(); } class _NoticeInformationState extends State { @override Widget build(BuildContext context) { return DataRequired( fetchData: (global) async { var loop = resolve("/appNotice/app-o/modelNotice"); var data = await global.requester.get(loop); var dataString = utf8.decode(data.bodyBytes); var jsonData = jsonDecode(dataString); return jsonData; }, afterLoading: (data){ var dataContent = data["data"]; return Card( margin: const EdgeInsetsDirectional.only(top: 10), child: Padding( padding: const EdgeInsetsDirectional.all(20), child: SizedBox( child: Flex( direction: Axis.horizontal, children: [ const Column( children: [ Text( "楷模", style: TextStyle( color: Colors.red, fontWeight: FontWeight.bold, fontSize: 20 ), ), Text( "公告", style: TextStyle( color: Colors.black, fontWeight: FontWeight.bold, fontSize: 20 ), ) ], ), Container( height: 70, margin: const EdgeInsetsDirectional.only(start: 10), child: const VerticalDivider( thickness: 1, color: Colors.grey, ) ), Expanded( child: SizedBox( height: 80, child: PageView.builder( itemCount: dataContent.length, itemBuilder: (BuildContext context, int index) { var i = dataContent[index]; return ListTile( title: Text(i['title']), subtitle: Text(i["content"], overflow: TextOverflow.ellipsis, maxLines: 2), trailing: const Icon(MaterialDesign.keyboard_arrow_right), ); } ), ) ) ], ), ), ) ); } ); } } class IconNameButton extends StatefulWidget { final String text; final IconData icon; final bool selected; final Function() onTap; const IconNameButton({super.key, required this.text, required this.icon, required this.selected, required this.onTap}); @override State createState() => _IconNameButtonState(); } class _IconNameButtonState extends State { @override Widget build(BuildContext context) { return TextButton( onPressed: widget.onTap, style: ButtonStyle( shape: WidgetStateProperty.all(const RoundedRectangleBorder()) ), child: Column( mainAxisSize: MainAxisSize.min, children: [ Icon(widget.icon), Text( widget.text, style: TextStyle( color: widget.selected ? Colors.red : Colors.black ), ) ], ) ); } } class IconName { final IconData icon; final String text; IconName({required this.icon, required this.text}); } class FunctionalCard extends StatefulWidget { final bool Function(int index) onChange; const FunctionalCard({super.key, required this.onChange}); @override State createState() => _FunctionalCardState(); } class _FunctionalCardState extends State { final List items = [ IconName(icon: MaterialDesign.format_list_bulleted, text: "楷模列表"), IconName(icon: MaterialDesign.collections_bookmark, text: "英雄故事"), IconName(icon: MaterialDesign.people, text: "身边英雄"), IconName(icon: MaterialDesign.card_giftcard, text: "物资捐赠"), IconName(icon: MaterialDesign.view_stream, text: "数据分析"), IconName(icon: MaterialDesign.more, text: "更多"), ]; int _index = 0; @override Widget build(BuildContext context) { return Container( margin: const EdgeInsetsDirectional.only(top: 10), child: Card( child: Padding( padding: const EdgeInsetsDirectional.all(10), child: GridView.builder( physics: const NeverScrollableScrollPhysics(), gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3, ), shrinkWrap: true, itemCount: items.length, itemBuilder: (BuildContext context, int index){ var data = items[index]; return IconNameButton(text: data.text, icon: data.icon, selected: index == _index, onTap: () { if (widget.onChange(index)){ setState(() { _index = index; }); } }); }, ), ) ), ); } }