如何与 moor 一起实施 Change Notifier?

How to implement Change Notifier along with moor?

我正在尝试制作一个具有数据库的应用程序,它有一个 table Students

class Students extends Table{

  IntColumn get RollNumber=>integer().autoIncrement()();
  TextColumn get Name => text().withLength(min: 3,max:32)();

  Students( String name){
    Name==name;
  }

@UseMoor(tables: [Students])
class myDatabase extends _$myDatabase {

  myDatabase() : super(_openConnection());
  @override
  int get schemaVersion => 1;

  // loads all student entries

  Future<List<Student>> getAllStudents() => select(students).get();

  //Watches all entries in Students and automatically
  //emits new data when data changes
  Stream<List<Student>>  watchAllStudents()=> select(students).watch();

  Future insertStudent(Student student )=>into(students).insert(student);
  //Future UpdateStudent(Student student )=>update(students).replace(student);
  //Future DeleteStudent(Student student )=>into(students).insert(student);
}

现在我尝试将更改通知程序与 myDatabase 一起使用,但在这里我无法扩展它,所以我尝试这样做

class myDatabase extends _$myDatabase with ChangeNotifier{
..
}

但是学生class显示错误。现在不知道怎么办了。

更好的方法是为数据库操作创建服务,例如

class DatabaseService with ChangeNotifier {
      Future<List<Students>> getListOfStudents() async {
        // fetch list of students here and return it to the function that calls the DB service
      }
   }

然后创建一个 ViewModel,它为 Screen/Widget 或您打算供学生使用的视图实现 ChangeNotifier。ViewModel 将调用 DatabaseService 和 return 来自数据库的值。例如

class StudentViewModel with ChangeNotifier {

setState() {
  notifyListeners();
 }

Future<void> getStudents() async {
  // get students list from db service and call setState() to notifyListeners
 }
}

注意:数据库实例有点昂贵,因此您应该创建数据库和数据库服务的单例实例。如果您尝试打开数据库的多个实例,moor 将抛出一个异常来提醒您。