Browse Source

整理项目

jianboy 1 year ago
parent
commit
6411ecf87b

+ 0 - 37
lib/bean/bean.dart

@@ -1,37 +0,0 @@
-import 'package:flutter/cupertino.dart';
-
-// class Campus{
-//   String name;
-//   late int id;
-//   static int _id_count=0;
-//   Map<String,Canteen>canteens=Map();
-//   Campus(this.name){id=++_id_count;}
-//   Canteen addCanteen(String name){
-//     canteens[name]=Canteen(name);
-//     return canteens[name]!;
-//   }
-// }
-// class Canteen{
-//   String name;
-//   Dishes daily=Dishes();  //当日菜品(固定)
-//   Dishes special=Dishes();//特色菜品
-//   Dishes nowaday=Dishes();//当日新菜
-//   Canteen(this.name);
-// }
-class Dish {
-  String name;
-  String cost; //价格
-  String time; //供应时间
-  //String category;  //菜品分类:当日菜品(固定),特色菜品,当日新菜
-  //String campus;    //校区
-  String canteen; //食堂
-  bool star = false, like = false;
-  //DateTime? star_time=null;
-
-  Dish(this.name, this.cost, this.time, this.canteen,
-      {bool like = false, bool star = false, DateTime? star_time}) {
-    this.like = like;
-    this.star = star;
-    //if(star_time!=null)this.star_time=star_time;
-  }
-}

+ 0 - 0
lib/campus_list.dart


+ 19 - 7
lib/main.dart

@@ -1,9 +1,22 @@
-import 'package:flutter/material.dart';
-import 'package:canteen/ui/CanteenMain.dart';
-import 'package:canteen/bean/themes.dart';
+import 'dart:io';
 
+import 'package:flutter/material.dart';
+import 'package:canteen/ui/home_page.dart';
+import 'package:canteen/model/themes.dart';
+import 'package:flutter/services.dart';
 
 void main() {
+  WidgetsFlutterBinding.ensureInitialized();
+  // 竖屏
+  SystemChrome.setPreferredOrientations([
+    DeviceOrientation.portraitUp,
+    DeviceOrientation.portraitDown,
+  ]);
+  //设置Android头部的导航栏透明
+  if (Platform.isAndroid) {
+    SystemChrome.setSystemUIOverlayStyle(
+        const SystemUiOverlayStyle(statusBarColor: Colors.transparent));
+  }
   runApp(const MyApp());
 }
 
@@ -14,11 +27,10 @@ class MyApp extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return MaterialApp(
-      title: 'Flutter Demo',
+      title: '食堂App',
+      debugShowCheckedModeBanner: false,
       theme: Themes.defaultTheme,
-      home: CanteenMain(),
-
+      home: HomePage(),
     );
   }
 }
-

+ 19 - 0
lib/model/campus_model.dart

@@ -0,0 +1,19 @@
+
+import 'package:canteen/model/canteen_model.dart';
+
+/// Description: 校区
+/// Time       : 07/25/2022 Monday
+/// Author     : liuyuqi.gov@msn.cn
+class CampusModel {
+  String name; /// 校区名
+  late int id;
+  static int _id_count = 0;
+  Map<String, CanteenModel> canteens = Map();
+  CampusModel(this.name) {
+    id = ++_id_count;
+  }
+  CanteenModel addCanteen(String name) {
+    canteens[name] = CanteenModel(name);
+    return canteens[name]!;
+  }
+}

+ 14 - 0
lib/model/canteen_model.dart

@@ -0,0 +1,14 @@
+import 'package:canteen/model/dish_model.dart';
+
+/// Description: 食堂
+/// Time       : 07/25/2022 Monday
+/// Author     : liuyuqi.gov@msn.cn
+class CanteenModel {
+  ///食堂名称
+  String name;
+
+  DishsModel daily = DishsModel(); //当日菜品(固定)
+  DishsModel special = DishsModel(); //特色菜品
+  DishsModel nowaday = DishsModel(); //当日新菜
+  CanteenModel(this.name);
+}

+ 28 - 0
lib/model/dish_model.dart

@@ -0,0 +1,28 @@
+/// Description: 菜谱
+/// Time       : 07/25/2022 Monday
+/// Author     : liuyuqi.gov@msn.cn
+class DishModel {
+  String name;
+  String cost; //价格
+  String time; //供应时间
+  //String category;  //菜品分类:当日菜品(固定),特色菜品,当日新菜
+  //String campus;    //校区
+  String canteen; //食堂
+  bool star = false, like = false;
+  //DateTime? star_time=null;
+
+  DishModel(this.name, this.cost, this.time, this.canteen,
+      {bool like = false, bool star = false, DateTime? star_time}) {
+    this.like = like;
+    this.star = star;
+    //if(star_time!=null)this.star_time=star_time;
+  }
+}
+
+class DishsModel {
+  List<DishModel> dishs = [];
+
+  DishsModel();
+
+  DishsModel.fromJson(Map<String, dynamic> json) {}
+}

+ 0 - 3
lib/bean/themes.dart → lib/model/themes.dart

@@ -1,7 +1,4 @@
 import 'package:flutter/material.dart';
-/*import 'package:isdu_flutter/ui/activityview.dart';
-import 'package:isdu_flutter/ui/news.dart';
-import 'package:isdu_flutter/ui/phone.dart';*/
 
 ///优先使用Theme中的颜色,如果Theme中颜色不满足需求再使用colorScheme中的颜色
 ///primaryColor是主颜色,确定色系

+ 0 - 84
lib/ui/CanteenDishListView.dart

@@ -1,84 +0,0 @@
-import 'package:canteen/bean/bean.dart';
-import 'package:flutter/material.dart';
-
-class CanteenDishListView extends StatelessWidget{
-  final List<Dish> dishes;
-  final void Function(int index)?onLikePressed;
-  final void Function(int index)?onStarPressed;
-  CanteenDishListView(this.dishes,{this.onLikePressed=null,this.onStarPressed=null});
-  
-  @override
-  Widget build(BuildContext context) {
-    return ListView.separated(
-      shrinkWrap: true,
-      addRepaintBoundaries: true,
-      itemCount: dishes.length,
-      itemBuilder: (BuildContext context,int index){
-        return _DishListViewItem(
-          index,
-          dishes[index],
-          onLikePressed,
-          onStarPressed
-        );
-      },
-      separatorBuilder: (context,index){return const Divider(color:Colors.grey);},
-    );
-  }
-}
-class _DishListViewItem extends StatelessWidget{
-  final int id;
-  final Dish dish;
-  final void Function(int index)?onLikePressed;
-  final void Function(int index)?onStarPressed;
-
-  const _DishListViewItem(this.id,this.dish,this.onLikePressed,this.onStarPressed);
-
-  @override
-  //5:3=20:12
-  //4:3=12:9
-  Widget build(BuildContext context){
-    return Row(
-      mainAxisAlignment: MainAxisAlignment.end,
-      children: [
-        Expanded(
-          child: Column(
-            children: [
-              Padding(child:Row(
-                children: [
-                  Text(dish.name,textScaleFactor: 2,),
-                  Expanded(child:Row(
-                      mainAxisAlignment: MainAxisAlignment.end,
-                      children:[Padding(child:Text(dish.cost,textScaleFactor: 1.2,),
-                    padding: EdgeInsets.fromLTRB(0,0,16,0),
-                  )]))
-                ],
-              ),
-              padding:EdgeInsets.fromLTRB(6,4,4,4)),
-              Padding(child:Row(
-                children: [
-                  Text(dish.canteen,textScaleFactor: 0.9,),
-                  Expanded(child:Row(
-                      mainAxisAlignment: MainAxisAlignment.end,
-                      children:[Padding(child:Text(dish.time,textScaleFactor: 0.9,),
-                        padding: EdgeInsets.fromLTRB(0,0,20,0),
-                      )]))
-                ],
-              ),
-                padding: EdgeInsets.fromLTRB(6, 0, 0, 6),
-              )
-            ],
-          ),
-        ),
-        IconButton(
-            onPressed: (){if(onLikePressed!=null)onLikePressed!(this.id);},
-            icon: Icon(dish.like?Icons.favorite:Icons.favorite_border,color:dish.like?Colors.red:null)
-        ),
-        IconButton(
-            onPressed: (){if(onStarPressed!=null)onStarPressed!(this.id);},
-            icon: Icon(dish.star?Icons.star:Icons.star_border,color:dish.star?Colors.amber:null)
-        ),
-
-      ],
-    );
-  }
-}

+ 39 - 0
lib/ui/food_list_page.dart

@@ -0,0 +1,39 @@
+import 'package:canteen/model/dish_model.dart';
+import 'package:canteen/widget/canteen_dish_listview.dart';
+import 'package:flutter/material.dart';
+
+class FoodListPage extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+        appBar: AppBar(
+          title: const Text("食堂菜谱"),
+          leading: Builder(
+            builder: (context) {
+              return IconButton(
+                icon: const Icon(Icons.arrow_back, color: Colors.white),
+                onPressed: () {
+                  Navigator.pop(context);
+                },
+              );
+            },
+          ),
+        ),
+        body: CanteenDishListView([
+          DishModel("牛肉炖土豆", "10元/份", "早/中/晚", "一食堂一号窗口",
+              like: true, star: true),
+          DishModel("马铃薯炒土豆", "8元/份", "早/中/晚", "一食堂一号窗口",
+              like: true, star: true),
+          DishModel("番茄炒鸡蛋", "8元/份", "早/中/晚", "一食堂一号窗口", star: true),
+          DishModel("番茄炒西红柿", "5元/份", "早/中/晚", "一食堂一号窗口", star: true),
+          DishModel("牛肉面", "10元/份", "早/中/晚", "一食堂一号窗口"),
+          DishModel("牛肉刀削面", "10元/份", "早/中/晚", "一食堂一号窗口"),
+          DishModel("刀削牛肉面", "10元/份", "早/中/晚", "一食堂一号窗口"),
+          DishModel("牛刀削肉面", "10元/份", "早/中/晚", "一食堂一号窗口"),
+          DishModel("凑数", "元/10份", "//", "食堂窗口"),
+          DishModel("凑数", "元/10份", "//", "食堂窗口"),
+          DishModel("凑数", "元/10份", "//", "食堂窗口"),
+          DishModel("凑数", "元/10份", "//", "食堂窗口"),
+        ]));
+  }
+}

+ 81 - 73
lib/ui/CanteenMain.dart → lib/ui/home_page.dart

@@ -1,22 +1,24 @@
-import 'package:canteen/ui/listviewexample.dart';
-import 'package:canteen/widget/ChznExpansionPanelList.dart';
+import 'package:canteen/ui/food_list_page.dart';
+import 'package:canteen/widget/chzn_expansion_panel_list.dart';
 import 'package:flutter/material.dart';
 
-class CanteenMain extends StatefulWidget {
-  const CanteenMain({Key? key}) : super(key: key);
+class HomePage extends StatefulWidget {
+  const HomePage({Key? key}) : super(key: key);
 
   @override
-  State<CanteenMain> createState() => CanteenMainState();
+  State<HomePage> createState() => HomePageState();
 }
 
-class CanteenMainState extends State<CanteenMain> {
+class HomePageState extends State<HomePage> {
   @override
   Widget build(BuildContext context) {
     return Scaffold(
+      /// 标题栏
       appBar: AppBar(
         title: const Text("食堂菜谱"),
         leading: Builder(
           builder: (context) {
+            ///返回按钮
             return IconButton(
               icon: const Icon(Icons.arrow_back, color: Colors.white),
               onPressed: () {
@@ -30,6 +32,7 @@ class CanteenMainState extends State<CanteenMain> {
         color: Colors.white,
         child: Column(
           children: [
+            /// 输入框栏
             Row(children: [
               Expanded(
                   child: Container(
@@ -50,9 +53,8 @@ class CanteenMainState extends State<CanteenMain> {
                     focusNode.addListener(() {
                       if (focusNode.hasFocus) {
                         focusNode.unfocus();
-
                         //跳转至搜索页面
-
+                        // Navigator.push(context, route);
                       }
                     });
                     return focusNode;
@@ -70,12 +72,12 @@ class CanteenMainState extends State<CanteenMain> {
                   //此处应当跳转至收藏页面
                   Navigator.of(context)
                       .push(MaterialPageRoute(builder: (context) {
-                    return listviewexpamle();
+                    return FoodListPage();
                   }));
                 },
               )
             ]),
-            _CampusListView()
+            CampusListView()
           ],
         ),
       ),
@@ -83,7 +85,7 @@ class CanteenMainState extends State<CanteenMain> {
   }
 }
 
-class _CampusListView extends StatefulWidget {
+class CampusListView extends StatefulWidget {
   static const campus = ["中心", "软件园", "洪家楼", "趵突泉", "千佛山", "兴隆山", "青岛", "威海"];
   static const campusImage = [
     "zhongxin",
@@ -95,21 +97,84 @@ class _CampusListView extends StatefulWidget {
     "qianfo",
     "zhongxin"
   ];
-  final _campusList = _createCampus(campus, campusImage);
+  late final _campusList;
 
   @override
-  State<_CampusListView> createState() => _CampusListViewState();
-}
+  State<CampusListView> createState() {
+    _campusList = _createCampus(campus, campusImage);
+    return _CampusListViewState();
+  }
 
-int _selectCampus = -1;
+  List<_CampusViewItem> _createCampus(
+      List<String> campus, List<String> campusImage) {
+    return List.generate(campus.length, (index) {
+      return _CampusViewItem(
+        header: ListTile(
+          leading: ClipOval(
+              child: Image.asset(
+            "assets/location_${campusImage[index]}.png",
+            width: 30,
+            height: 30,
+          )),
+          title: Text('${campus[index]}校区'),
+        ),
+        body: Container(
+            color: Colors.white,
+            child: Padding(
+                padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),
+                child: Container(
+                  decoration: BoxDecoration(
+                      color: Colors.white,
+                      borderRadius: BorderRadius.circular(10.0),
+                      boxShadow: const [
+                        BoxShadow(color: Colors.black12, blurRadius: 8.0)
+                      ]),
+                  child: Center(
+                    child: Column(
+                      children: [
+                        ElevatedButton(
+                          onPressed: () {
+                            //跳转到相应界面 传参_selectCampus
+                          },
+                          child: const Text("当日菜品(固定)"), //这里对齐太难处理,我偷懒用全角空格对齐
+                          style: ButtonStyle(
+                            shape: MaterialStateProperty.all(
+                                const StadiumBorder(side: BorderSide.none)),
+                          ),
+                        ),
+                        ElevatedButton(
+                            onPressed: () {},
+                            child: const Text("特色菜品"),
+                            style: ButtonStyle(
+                                shape: MaterialStateProperty.all(
+                                    const StadiumBorder(
+                                        side: BorderSide.none)))),
+                        ElevatedButton(
+                            onPressed: () {},
+                            child: const Text("当日新菜"),
+                            style: ButtonStyle(
+                                shape: MaterialStateProperty.all(
+                                    const StadiumBorder(
+                                        side: BorderSide.none)))),
+                      ],
+                    ),
+                  ),
+                ))),
+      );
+    });
+  }
+}
 
-class _CampusListViewState extends State<_CampusListView> {
+class _CampusListViewState extends State<CampusListView> {
   int select = -1;
+  int _selectCampus = -1;
 
   @override
   Widget build(BuildContext context) {
     return Expanded(
         child: SingleChildScrollView(
+
+            /// 折叠列表
             child: ChznExpansionPanelList(
       expansionCallback: (int index, bool isExpanded) {
         setState(() {
@@ -153,60 +218,3 @@ class _CampusViewItem {
       this.isExpanded = false,
       this.id = 0});
 }
-
-List<_CampusViewItem> _createCampus(
-    List<String> campus, List<String> campusImage) {
-  return List.generate(campus.length, (index) {
-    return _CampusViewItem(
-      header: ListTile(
-        leading: ClipOval(
-            child: Image.asset(
-          "assets/location_${campusImage[index]}.png",
-          width: 30,
-          height: 30,
-        )),
-        title: Text('${campus[index]}校区'),
-      ),
-      body: Container(
-          color: Colors.white,
-          child: Padding(
-              padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),
-              child: Container(
-                decoration: BoxDecoration(
-                    color: Colors.white,
-                    borderRadius: BorderRadius.circular(10.0),
-                    boxShadow: const [
-                      BoxShadow(color: Colors.black12, blurRadius: 8.0)
-                    ]),
-                child: Center(
-                  child: Column(
-                    children: [
-                      ElevatedButton(
-                        onPressed: () {
-                          //跳转到相应界面 传参_selectCampus
-                        },
-                        child: const Text(" 当日菜品(固定) "), //这里对齐太难处理,我偷懒用全角空格对齐
-                        style: ButtonStyle(
-                          shape: MaterialStateProperty.all(
-                              const StadiumBorder(side: BorderSide.none)),
-                        ),
-                      ),
-                      ElevatedButton(
-                          onPressed: () {},
-                          child: const Text("   特色菜品   "),
-                          style: ButtonStyle(
-                              shape: MaterialStateProperty.all(
-                                  const StadiumBorder(side: BorderSide.none)))),
-                      ElevatedButton(
-                          onPressed: () {},
-                          child: const Text("   当日新菜   "),
-                          style: ButtonStyle(
-                              shape: MaterialStateProperty.all(
-                                  const StadiumBorder(side: BorderSide.none)))),
-                    ],
-                  ),
-                ),
-              ))),
-    );
-  });
-}

+ 0 - 39
lib/ui/listviewexample.dart

@@ -1,39 +0,0 @@
-import 'package:canteen/bean/bean.dart';
-import 'package:canteen/ui/CanteenDishListView.dart';
-import 'package:flutter/material.dart';
-
-class listviewexpamle extends StatelessWidget{
-  @override
-  Widget build(BuildContext context) {
-    // TODO: implement build
-    return Scaffold(
-        appBar: AppBar(
-          title: const Text("食堂菜谱"),
-          leading: Builder(
-            builder: (context) {
-              return IconButton(
-                icon: const Icon(Icons.arrow_back, color: Colors.white),
-                onPressed: () {
-                  Navigator.pop(context);
-                },
-              );
-            },
-          ),
-        ),
-        body:CanteenDishListView([
-          Dish("牛肉炖土豆","10元/份","早/中/晚","一食堂一号窗口",like:true,star:true),
-          Dish("马铃薯炒土豆","8元/份","早/中/晚","一食堂一号窗口",like:true,star:true),
-          Dish("番茄炒鸡蛋","8元/份","早/中/晚","一食堂一号窗口",star:true),
-          Dish("番茄炒西红柿","5元/份","早/中/晚","一食堂一号窗口",star:true),
-          Dish("牛肉面","10元/份","早/中/晚","一食堂一号窗口"),
-          Dish("牛肉刀削面","10元/份","早/中/晚","一食堂一号窗口"),
-          Dish("刀削牛肉面","10元/份","早/中/晚","一食堂一号窗口"),
-          Dish("牛刀削肉面","10元/份","早/中/晚","一食堂一号窗口"),
-          Dish("凑数","元/10份","//","食堂窗口"),
-          Dish("凑数","元/10份","//","食堂窗口"),
-          Dish("凑数","元/10份","//","食堂窗口"),
-          Dish("凑数","元/10份","//","食堂窗口"),
-        ])
-    );
-  }
-}

+ 17 - 0
lib/ui/search_page.dart

@@ -0,0 +1,17 @@
+import 'package:flutter/material.dart';
+
+class SearchPage extends StatefulWidget {
+  const SearchPage({Key? key}) : super(key: key);
+
+  @override
+  State<SearchPage> createState() => _SearchPageState();
+}
+
+class _SearchPageState extends State<SearchPage> {
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      child: Text("Search Page."),
+    );
+  }
+}

+ 114 - 0
lib/widget/canteen_dish_listview.dart

@@ -0,0 +1,114 @@
+import 'package:canteen/model/dish_model.dart';
+import 'package:flutter/material.dart';
+
+/// Description: 食堂菜谱
+/// Time       : 07/25/2022 Monday
+/// Author     : liuyuqi.gov@msn.cn
+class CanteenDishListView extends StatelessWidget {
+  final List<DishModel> dishes;
+  final void Function(int index)? onLikePressed;
+  final void Function(int index)? onStarPressed;
+  CanteenDishListView(this.dishes,
+      {this.onLikePressed = null, this.onStarPressed = null});
+
+  @override
+  Widget build(BuildContext context) {
+    /// 列表
+    return ListView.separated(
+      shrinkWrap: true,
+      addRepaintBoundaries: true,
+      itemCount: dishes.length,
+      itemBuilder: (BuildContext context, int index) {
+        return _DishListViewItem(
+            index, dishes[index], onLikePressed, onStarPressed);
+      },
+      separatorBuilder: (context, index) {
+        return const Divider(color: Colors.grey);
+      },
+    );
+  }
+}
+
+class _DishListViewItem extends StatelessWidget {
+  final int id;
+  final DishModel dish;
+  final void Function(int index)? onLikePressed;
+  final void Function(int index)? onStarPressed;
+
+  const _DishListViewItem(
+      this.id, this.dish, this.onLikePressed, this.onStarPressed);
+
+  @override
+  //5:3=20:12
+  //4:3=12:9
+  Widget build(BuildContext context) {
+    return Row(
+      mainAxisAlignment: MainAxisAlignment.end,
+      children: [
+        Expanded(
+          child: Column(
+            children: [
+              Padding(
+                  child: Row(
+                    children: [
+                      Text(
+                        dish.name,
+                        textScaleFactor: 2,
+                      ),
+                      Expanded(
+                          child: Row(
+                              mainAxisAlignment: MainAxisAlignment.end,
+                              children: [
+                            Padding(
+                              child: Text(
+                                dish.cost,
+                                textScaleFactor: 1.2,
+                              ),
+                              padding: EdgeInsets.fromLTRB(0, 0, 16, 0),
+                            )
+                          ]))
+                    ],
+                  ),
+                  padding: EdgeInsets.fromLTRB(6, 4, 4, 4)),
+              Padding(
+                child: Row(
+                  children: [
+                    Text(
+                      dish.canteen,
+                      textScaleFactor: 0.9,
+                    ),
+                    Expanded(
+                        child: Row(
+                            mainAxisAlignment: MainAxisAlignment.end,
+                            children: [
+                          Padding(
+                            child: Text(
+                              dish.time,
+                              textScaleFactor: 0.9,
+                            ),
+                            padding: EdgeInsets.fromLTRB(0, 0, 20, 0),
+                          )
+                        ]))
+                  ],
+                ),
+                padding: EdgeInsets.fromLTRB(6, 0, 0, 6),
+              )
+            ],
+          ),
+        ),
+        IconButton(
+            onPressed: () {
+              if (onLikePressed != null) onLikePressed!(this.id);
+            },
+            icon: Icon(dish.like ? Icons.favorite : Icons.favorite_border,
+                color: dish.like ? Colors.red : null)),
+        IconButton(
+            onPressed: () {
+              if (onStarPressed != null) onStarPressed!(this.id);
+            },
+            icon: Icon(dish.star ? Icons.star : Icons.star_border,
+                color: dish.star ? Colors.amber : null)),
+      ],
+    );
+  }
+}

+ 54 - 38
lib/widget/ChznExpansionPanelList.dart → lib/widget/chzn_expansion_panel_list.dart

@@ -5,7 +5,6 @@
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
 
-
 const double _kPanelHeaderCollapsedHeight = kMinInteractiveDimension;
 const EdgeInsets _kPanelHeaderExpandedDefaultPadding = EdgeInsets.symmetric(
   vertical: 64.0 - _kPanelHeaderCollapsedHeight,
@@ -19,11 +18,10 @@ class _SaltedKey<S, V> extends LocalKey {
 
   @override
   bool operator ==(Object other) {
-    if (other.runtimeType != runtimeType)
-      return false;
-    return other is _SaltedKey<S, V>
-        && other.salt == salt
-        && other.value == value;
+    if (other.runtimeType != runtimeType) return false;
+    return other is _SaltedKey<S, V> &&
+        other.salt == salt &&
+        other.value == value;
   }
 
   @override
@@ -38,8 +36,10 @@ class _SaltedKey<S, V> extends LocalKey {
 }
 
 typedef ExpansionPanelCallback = void Function(int panelIndex, bool isExpanded);
-typedef ExpansionPanelHeaderBuilder = Widget Function(BuildContext context, bool isExpanded);
+typedef ExpansionPanelHeaderBuilder = Widget Function(
+    BuildContext context, bool isExpanded);
 
+/// 折叠列表
 class ChznExpansionPanelList extends StatefulWidget {
   const ChznExpansionPanelList({
     Key? key,
@@ -49,7 +49,7 @@ class ChznExpansionPanelList extends StatefulWidget {
     this.expandedHeaderPadding = _kPanelHeaderExpandedDefaultPadding,
     this.dividerColor,
     this.elevation = 2,
-  }) : assert(children != null),
+  })  : assert(children != null),
         assert(animationDuration != null),
         _allowOnlyOnePanelOpen = false,
         initialOpenPanelValue = null,
@@ -63,7 +63,7 @@ class ChznExpansionPanelList extends StatefulWidget {
     this.expandedHeaderPadding = _kPanelHeaderExpandedDefaultPadding,
     this.dividerColor,
     this.elevation = 2,
-  }) : assert(children != null),
+  })  : assert(children != null),
         assert(animationDuration != null),
         _allowOnlyOnePanelOpen = true,
         super(key: key);
@@ -87,10 +87,12 @@ class _ExpansionPanelListState extends State<ChznExpansionPanelList> {
   void initState() {
     super.initState();
     if (widget._allowOnlyOnePanelOpen) {
-      assert(_allIdentifiersUnique(), 'All ExpansionPanelRadio identifier values must be unique.');
+      assert(_allIdentifiersUnique(),
+          'All ExpansionPanelRadio identifier values must be unique.');
       if (widget.initialOpenPanelValue != null) {
-        _currentOpenPanel =
-            searchPanelByValue(widget.children.cast<ExpansionPanelRadio>(), widget.initialOpenPanelValue);
+        _currentOpenPanel = searchPanelByValue(
+            widget.children.cast<ExpansionPanelRadio>(),
+            widget.initialOpenPanelValue);
       }
     }
   }
@@ -100,12 +102,12 @@ class _ExpansionPanelListState extends State<ChznExpansionPanelList> {
     super.didUpdateWidget(oldWidget);
 
     if (widget._allowOnlyOnePanelOpen) {
-      assert(_allIdentifiersUnique(), 'All ExpansionPanelRadio identifier values must be unique.');
-      // If the previous widget was non-radio ExpansionPanelList, initialize the
-      // open panel to widget.initialOpenPanelValue
+      assert(_allIdentifiersUnique(),
+          'All ExpansionPanelRadio identifier values must be unique.');
       if (!oldWidget._allowOnlyOnePanelOpen) {
-        _currentOpenPanel =
-            searchPanelByValue(widget.children.cast<ExpansionPanelRadio>(), widget.initialOpenPanelValue);
+        _currentOpenPanel = searchPanelByValue(
+            widget.children.cast<ExpansionPanelRadio>(),
+            widget.initialOpenPanelValue);
       }
     } else {
       _currentOpenPanel = null;
@@ -114,7 +116,8 @@ class _ExpansionPanelListState extends State<ChznExpansionPanelList> {
 
   bool _allIdentifiersUnique() {
     final Map<Object, bool> identifierMap = <Object, bool>{};
-    for (final ExpansionPanelRadio child in widget.children.cast<ExpansionPanelRadio>()) {
+    for (final ExpansionPanelRadio child
+        in widget.children.cast<ExpansionPanelRadio>()) {
       identifierMap[child.value] = true;
     }
     return identifierMap.length == widget.children.length;
@@ -122,7 +125,8 @@ class _ExpansionPanelListState extends State<ChznExpansionPanelList> {
 
   bool _isChildExpanded(int index) {
     if (widget._allowOnlyOnePanelOpen) {
-      final ExpansionPanelRadio radioWidget = widget.children[index] as ExpansionPanelRadio;
+      final ExpansionPanelRadio radioWidget =
+          widget.children[index] as ExpansionPanelRadio;
       return _currentOpenPanel?.value == radioWidget.value;
     }
     return widget.children[index].isExpanded;
@@ -132,12 +136,16 @@ class _ExpansionPanelListState extends State<ChznExpansionPanelList> {
     widget.expansionCallback?.call(index, isExpanded);
 
     if (widget._allowOnlyOnePanelOpen) {
-      final ExpansionPanelRadio pressedChild = widget.children[index] as ExpansionPanelRadio;
+      final ExpansionPanelRadio pressedChild =
+          widget.children[index] as ExpansionPanelRadio;
 
       // If another ExpansionPanelRadio was already open, apply its
       // expansionCallback (if any) to false, because it's closing.
-      for (int childIndex = 0; childIndex < widget.children.length; childIndex += 1) {
-        final ExpansionPanelRadio child = widget.children[childIndex] as ExpansionPanelRadio;
+      for (int childIndex = 0;
+          childIndex < widget.children.length;
+          childIndex += 1) {
+        final ExpansionPanelRadio child =
+            widget.children[childIndex] as ExpansionPanelRadio;
         if (widget.expansionCallback != null &&
             childIndex != index &&
             child.value == _currentOpenPanel?.value)
@@ -150,19 +158,20 @@ class _ExpansionPanelListState extends State<ChznExpansionPanelList> {
     }
   }
 
-  ExpansionPanelRadio? searchPanelByValue(List<ExpansionPanelRadio> panels, Object? value)  {
+  ExpansionPanelRadio? searchPanelByValue(
+      List<ExpansionPanelRadio> panels, Object? value) {
     for (final ExpansionPanelRadio panel in panels) {
-      if (panel.value == value)
-        return panel;
+      if (panel.value == value) return panel;
     }
     return null;
   }
 
   @override
   Widget build(BuildContext context) {
-    assert(kElevationToShadow.containsKey(widget.elevation),
-    'Invalid value for elevation. See the kElevationToShadow constant for'
-        ' possible elevation values.',
+    assert(
+      kElevationToShadow.containsKey(widget.elevation),
+      'Invalid value for elevation. See the kElevationToShadow constant for'
+      ' possible elevation values.',
     );
 
     final List<MergeableMaterialItem> items = <MergeableMaterialItem>[];
@@ -188,9 +197,12 @@ class _ExpansionPanelListState extends State<ChznExpansionPanelList> {
         ),
       );
       if (!child.canTapOnHeader) {
-        final MaterialLocalizations localizations = MaterialLocalizations.of(context);
+        final MaterialLocalizations localizations =
+            MaterialLocalizations.of(context);
         expandIconContainer = Semantics(
-          label: _isChildExpanded(index)? localizations.expandedIconTapHint : localizations.collapsedIconTapHint,
+          label: _isChildExpanded(index)
+              ? localizations.expandedIconTapHint
+              : localizations.collapsedIconTapHint,
           container: true,
           child: expandIconContainer,
         );
@@ -201,9 +213,12 @@ class _ExpansionPanelListState extends State<ChznExpansionPanelList> {
             child: AnimatedContainer(
               duration: widget.animationDuration,
               curve: Curves.fastOutSlowIn,
-              margin: _isChildExpanded(index) ? widget.expandedHeaderPadding : EdgeInsets.zero,
+              margin: _isChildExpanded(index)
+                  ? widget.expandedHeaderPadding
+                  : EdgeInsets.zero,
               child: ConstrainedBox(
-                constraints: const BoxConstraints(minHeight: _kPanelHeaderCollapsedHeight),
+                constraints: const BoxConstraints(
+                    minHeight: _kPanelHeaderCollapsedHeight),
                 child: headerWidget,
               ),
             ),
@@ -229,19 +244,20 @@ class _ExpansionPanelListState extends State<ChznExpansionPanelList> {
               AnimatedCrossFade(
                 firstChild: Container(height: 0.0),
                 secondChild: child.body,
-                firstCurve: const Interval(0.0, 0.6, curve: Curves.fastOutSlowIn),
-                secondCurve: const Interval(0.4, 1.0, curve: Curves.fastOutSlowIn),
+                firstCurve:
+                    const Interval(0.0, 0.6, curve: Curves.fastOutSlowIn),
+                secondCurve:
+                    const Interval(0.4, 1.0, curve: Curves.fastOutSlowIn),
                 sizeCurve: Curves.fastOutSlowIn,
-                crossFadeState: _isChildExpanded(index) ? CrossFadeState.showSecond : CrossFadeState.showFirst,
+                crossFadeState: _isChildExpanded(index)
+                    ? CrossFadeState.showSecond
+                    : CrossFadeState.showFirst,
                 duration: widget.animationDuration,
               ),
             ],
           ),
         ),
       );
-
-       // if (_isChildExpanded(index) && index != widget.children.length - 1)
-       //   items.add(MaterialGap(key: _SaltedKey<BuildContext, int>(context, index * 2 + 1)));
     }
 
     return MergeableMaterial(