2024-09-04 19:04:29 +08:00

334 lines
10 KiB
Dart

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<HomeView> createState() => _HomeViewState();
}
class _HomeViewState extends State<HomeView> {
Widget? lastWidget;
late List<Widget> items;
late List<Widget? Function(BuildContext context)> 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<LoopImage> createState() => _LoopImageState();
}
class _LoopImageState extends State<LoopImage> {
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<Widget> 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<NoticeInformation> createState() => _NoticeInformationState();
}
class _NoticeInformationState extends State<NoticeInformation> {
@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<IconNameButton> createState() => _IconNameButtonState();
}
class _IconNameButtonState extends State<IconNameButton> {
@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<FunctionalCard> createState() => _FunctionalCardState();
}
class _FunctionalCardState extends State<FunctionalCard> {
final List<IconName> 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;
});
}
});
},
),
)
),
);
}
}