334 lines
10 KiB
Dart
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;
|
|
});
|
|
}
|
|
});
|
|
},
|
|
),
|
|
)
|
|
),
|
|
);
|
|
}
|
|
}
|