0

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

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{
..
}

但是学生类显示错误。现在我不知道如何进行。

4

1 回答 1

0

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

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 或 View 实现 ChangeNotifier。ViewModel 将调用 DatabaseService 并从数据库中返回值。例如

class StudentViewModel with ChangeNotifier {

setState() {
  notifyListeners();
 }

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

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

于 2020-05-23T10:51:38.207 回答