dart 有没有一种方法可以在不手动创建类的情况下创建新页面?flutter

qmelpv7a  于 2023-01-06  发布在  Flutter
关注(0)|答案(1)|浏览(80)

我有一个空页面让我们称之为“班级列表”,用户可以通过点击一个按钮并给它一个名称来在ListView中创建一个新的“班级”,当你点击那个“班级”时,它会在应用程序栏上打开一个具有该名称的新页面,让我们称这个新页面为“学生列表”,现在你可以在其中创建另一个列表,而我用Hive来存储数据。现在的问题是当你在“学生列表”页面创建学生列表时当你回来转到“班级列表”并点击另一个“班级”时,你先前创建的学生列表将出现在每个“班级”页面上。2这是因为我已经创建了一个班级(语法)学生列表页面,它将显示每一个“类”。因为它的用户谁创建“类”,我没有把任何限制,我不能为创建的页面创建无限的类(语法),那么我该怎么办呢?
class list page
inside class 1
inside class 2
以下是代码:

“列表类”代码:

import 'package:attendance/data/database.dart';
import 'package:flutter/material.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:attendance/insideList.dart';
import 'package:hive_flutter/hive_flutter.dart';

class lists extends StatefulWidget {
  const lists({super.key});

  @override
  State<lists> createState() => _listsState();
}

class _listsState extends State<lists> {
  final _myBox = Hive.box('mybox');

  ListDataBase db = ListDataBase();

  late TextEditingController _textController;
  @override
  void initState() {
    if (_myBox.get("NAMES") == null) {
      db.InitialData();
    } else {
      db.LoadData();
    }
    super.initState();
    _textController = TextEditingController();
  }

  @override
  void dispose() {
    _textController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    db.Items.sort();
    return Scaffold(
      body: db.Items.length > 0
          ? ListView.separated(
              itemCount: db.Items.length,
              itemBuilder: (_, index) {
                return ListTile(
                  leading: const Icon(Icons.school),
                  trailing: const Icon(Icons.arrow_forward),
                  title: Center(child: Text(db.Items[index])),
                  onTap: () {
                    Navigator.push(
                        context,
                        MaterialPageRoute(
                            builder: ((context) =>
                                InsideList(db.Items[index]))));
                  },
                  onLongPress: (() async {
                    await showDialog(
                        context: context,
                        builder: ((context) {
                          return AlertDialog(
                            title: const Text(
                              "Are you sure you want to delete this class?",
                              style: TextStyle(fontSize: 15),
                            ),
                            actions: [
                              TextButton(
                                  child: Text("cancel"),
                                  onPressed: (() {
                                    Navigator.pop(context);
                                  })),
                              TextButton(
                                child: Text('Delete'),
                                onPressed: () {
                                  setState(() {
                                    db.Items.removeAt(index);
                                    db.UpdateDataBase();
                                    Navigator.pop(context);
                                  });
                                },
                              ),
                            ],
                          );
                        }));
                  }),
                );
              },
              separatorBuilder: (BuildContext context, int index) =>
                  const Divider(
                color: Colors.black,
              ),
            )
          : const Center(
              child: Text("You currently have no classes. Add from below."),
            ),
      floatingActionButton: SpeedDial(
        animatedIcon: AnimatedIcons.menu_arrow,
        spacing: 6,
        spaceBetweenChildren: 6,
        backgroundColor: const Color.fromARGB(255, 22, 37, 50),
        foregroundColor: const Color.fromARGB(255, 255, 255, 255),
        children: [
          SpeedDialChild(
            child: const Icon(Icons.school),
            label: "add class",
            onTap: () async {
              final result = await showDialog(
                context: context,
                builder: (context) {
                  return AlertDialog(
                    title: const Text('Add a new class'),
                    content: TextField(
                      controller: _textController,
                      autofocus: true,
                      decoration: const InputDecoration(
                          hintText: "Enter the name of the class."),
                    ),
                    actions: [
                      TextButton(
                        child: Text('Cancel'),
                        onPressed: () {
                          Navigator.pop(context);
                        },
                      ),
                      TextButton(
                        child: Text('Add'),
                        onPressed: () {
                          Navigator.pop(context, _textController.text);
                          db.UpdateDataBase();
                          _textController.clear();
                        },
                      ),
                    ],
                  );
                },
              );
              if (result != null) {
                result as String;
                setState(() {
                  db.Items.add(result);
                });
              }
            },
          )
        ],
      ),
    );
  }
}

学生页面代码:

import 'package:attendance/data/StudentsDatabase.dart';
import 'package:flutter/material.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:hive_flutter/hive_flutter.dart';

class InsideList extends StatefulWidget {
  final String name;

  InsideList(this.name);

  @override
  State<InsideList> createState() => _InsideListState();
}

class _InsideListState extends State<InsideList> {
  final _myBox = Hive.box('mybox2');

  StudentsDatabase db = StudentsDatabase();

  late TextEditingController _textController;

  @override
  void initState() {
    if (_myBox.get("NAMES") == null) {
      db.InitialData();
    } else {
      db.LoadData();
    }
    super.initState();
    _textController = TextEditingController();
  }

  void _selectRadio(int index, int? val) {
    setState(() {
      db.SelectedRadio[index] = val ?? 0;
    });
  }

  @override
  void dispose() {
    _textController.dispose();
    super.dispose();
  }

  Widget build(BuildContext context) {
    db.Students.sort();
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.name),
        centerTitle: true,
        backgroundColor: const Color.fromARGB(255, 22, 37, 50),
        toolbarHeight: 65,
        shape: const RoundedRectangleBorder(
          borderRadius: BorderRadius.vertical(
            bottom: Radius.circular(30),
          ),
        ),
      ),
      body: db.Students.length > 0
          ? ListView.separated(
              itemCount: db.Students.length,
              itemBuilder: (_, index) {
                return ListTile(
                  leading: const Icon(Icons.person),
                  trailing: FittedBox(
                    fit: BoxFit.fill,
                    child: Row(
                      children: [
                        Radio(
                            activeColor: Colors.green,
                            value: 0,
                            groupValue: db.SelectedRadio[index],
                            onChanged: (val) {
                              _selectRadio(index, val);
                              db.UpdateDataBase();
                            }),
                        Radio(
                            activeColor: Colors.red,
                            value: 1,
                            groupValue: db.SelectedRadio[index],
                            onChanged: (val) {
                              _selectRadio(index, val);
                              db.UpdateDataBase();
                            }),
                      ],
                    ),
                  ),
                  title: Center(child: Text(db.Students[index])),
                  onTap: () {
                    Navigator.push(
                        context,
                        MaterialPageRoute(
                            builder: ((context) =>
                                InsideList(db.Students[index]))));
                  },
                  onLongPress: (() async {
                    await showDialog(
                        context: context,
                        builder: ((context) {
                          return AlertDialog(
                            title: const Text(
                              "Are you sure you want to delete this student?",
                              style: TextStyle(fontSize: 15),
                            ),
                            actions: [
                              TextButton(
                                  child: Text("cancel"),
                                  onPressed: (() {
                                    Navigator.pop(context);
                                  })),
                              TextButton(
                                child: Text('Delete'),
                                onPressed: () {
                                  setState(() {
                                    db.Students.removeAt(index);
                                    db.UpdateDataBase();
                                    Navigator.pop(context);
                                  });
                                },
                              ),
                            ],
                          );
                        }));
                  }),
                );
              },
              separatorBuilder: (BuildContext context, int index) =>
                  const Divider(
                color: Colors.black,
              ),
            )
          : const Center(
              child: Text("You currently have no students. Add from below."),
            ),
      floatingActionButton: SpeedDial(
        animatedIcon: AnimatedIcons.menu_arrow,
        spacing: 6,
        spaceBetweenChildren: 6,
        backgroundColor: const Color.fromARGB(255, 22, 37, 50),
        foregroundColor: const Color.fromARGB(255, 255, 255, 255),
        children: [
          SpeedDialChild(
            child: const Icon(Icons.group_add),
            label: "add student",
            onTap: () async {
              final result = await showDialog(
                context: context,
                builder: (context) {
                  return AlertDialog(
                    title: const Text('Add a new student'),
                    content: TextField(
                      controller: _textController,
                      autofocus: true,
                      decoration: const InputDecoration(
                          hintText: "Enter the name of the student."),
                    ),
                    actions: [
                      TextButton(
                        child: Text('Cancel'),
                        onPressed: () {
                          Navigator.pop(context);
                        },
                      ),
                      TextButton(
                        child: Text('Add'),
                        onPressed: () {
                          Navigator.pop(context, _textController.text);
                          db.UpdateDataBase();
                          _textController.clear();
                        },
                      ),
                    ],
                  );
                },
              );
              if (result != null) {
                result as String;
                setState(() {
                  db.Students.add(result);
                  db.SelectedRadio.add(0);
                });
              }
            },
          ),
        ],
      ),
    );
  }
}
eiee3dmh

eiee3dmh1#

据我所知,你需要将学生名单与每一个单独的班级联系起来。举个简单的例子。

List<ClassRoom> firstPageList = [];

 class ClassRoom {
  ClassRoom({required this.name});

  final String name;
  List<Student> students = [];
  }

 class Student {
  Student({required this.studentName});
  final String studentName;
 }

有点像这样,当一个新的ClassRoom类添加到列表中时,显示列表中的名字,然后把这个ClassRoom传递到下一页,在下一页中,使用这个ClassRoom示例,把所有的学生都添加到这个ClassRoom列表中。
现在,对于每个页面,你将有一个不同的class,对于每个类,你将有它的单独的Student
在此之后,您需要做的就是正确处理每个类的states,并设置一种正确存储它们的方法。

相关问题