StreamBuilder 抛出脏状态

2023-12-31

我正在尝试从互联网获取一些数据,将其存储到我的 sqlite 数据库中并使用ListView.

当我第一次获取数据时,一切正常,并且我能够在屏幕上看到数据,数据也被插入到 sqlite 数据库中,但是当我重新打开应用程序时,我收到一条错误消息

flutter: The following NoSuchMethodError was thrown building StreamBuilder<StudentModel>(dirty, state:
flutter: _StreamBuilderBaseState<StudentModel, AsyncSnapshot<StudentModel>>#3f888):
flutter: The getter 'studentData' was called on null.
flutter: Receiver: null
flutter: Tried calling: studentData

这是我的模型类

class StudentModel {
  int status;
  String msg;
  StudentModelData studentModelData;

  StudentModel({this.status, this.msg, this.studentModelData});

  StudentModel.fromJson(Map<String, dynamic> json) {
    status = json['status'];
    msg = json['msg'];
    studentModelData = json['data'] != null ? new StudentModelData.fromJson(json['data']) : null;
  }

  StudentModel.fromDb(Map<String, dynamic> parsedJson) {
    status = parsedJson['status'];
    msg = parsedJson['msg'];
    studentModelData = parsedJson['data'] != null ? new StudentModelData.fromJson(parsedJson['data']) : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['status'] = this.status;
    data['msg'] = this.msg;
    if (this.studentModelData != null) {
      data['data'] = this.studentModelData.toJson();
    }
    return data;
  }
}

class StudentModelData {
  int lastIndex;
  List<StudentData> studentData;

  StudentModelData({this.lastIndex, this.studentData});

  StudentModelData.fromJson(Map<String, dynamic> json) {
    lastIndex = json['lastIndex'];
    if (json['studentData'] != null) {
      studentData = new List<StudentData>();
      json['studentData'].forEach((v) {
        studentData.add(new StudentData.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['lastIndex'] = this.lastIndex;
    if (this.studentData != null) {
      data['studentData'] = this.studentData.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class StudentData {
  String studentId;
  String studName;
  String studProfilepic;
  String studentEmail;
  String studentMobile;
  String courseName;
  String classCode;
  int minAvg;
  int avg;

  StudentData(
      {this.studentId,
        this.studName,
        this.studProfilepic,
        this.studentEmail,
        this.studentMobile,
        this.courseName,
        this.classCode,
        this.minAvg,
        this.avg});

  StudentData.fromJson(Map<String, dynamic> json) {
    studentId = json['student_id'];
    studName = json['stud_name'];
    studProfilepic = json['stud_profilepic'];
    studentEmail = json['student_email'];
    studentMobile = json['student_mobile'];
    courseName = json['course_name'];
    classCode = json['class_code'];
    minAvg = json['minAvg'];
    avg = json['avg'];
  }

  StudentData.fromDb(Map<String, dynamic> parsedJson){
    studentId = parsedJson['student_id'];
    studName = parsedJson['stud_name'];
    studProfilepic = parsedJson['stud_profilepic'];
    studentEmail = parsedJson['student_email'];
    studentMobile = parsedJson['student_mobile'];
    courseName = parsedJson['course_name'];
    classCode = parsedJson['class_code'];
    minAvg = parsedJson['minAvg'];
    avg = parsedJson['avg'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['student_id'] = this.studentId;
    data['stud_name'] = this.studName;
    data['stud_profilepic'] = this.studProfilepic;
    data['student_email'] = this.studentEmail;
    data['student_mobile'] = this.studentMobile;
    data['course_name'] = this.courseName;
    data['class_code'] = this.classCode;
    data['minAvg'] = this.minAvg;
    data['avg'] = this.avg;
    return data;
  }
}

以下是我的存储库类

class StudentDbProvider implements Source, Cache {

  Database db;

  void init() async {
    print("database initialized");
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    final path = join(documentsDirectory.path, "students.db");
     db =  await openDatabase(path, version: 1,
        onCreate: (Database newDb, int version) {
      newDb.execute("""
        CREATE TABLE STUDENTS(
          id INTEGER PRIMARY KEY,
          student_id TEXT,
          stud_name TEXT,
          stud_profilepic TEXT,
          student_email TEXT,
          student_mobile TEXT,
          course_name TEXT,
          class_code TEXT,
          minAvg TEXT,
          avg TEXT
        )
       """);
    });


  }

  @override
  Future<int> clear() {
    return db.delete("STUDENTS");
  }

  @override
  Future<StudentModel> fetchStudents(String disciplineId, String schoolId,
      String year_id, String lastIndex) async {

    print("PritishSawant${db==null}");

    final maps =
        await db.query("STUDENTS");

    if (maps.length > 0) {
      return StudentModel.fromDb(maps.first);
    }

    return null;
  }


  @override
  Future<int> addStudent(StudentData studentData) {
    return db.insert("STUDENTS", studentData.toJson(),
        conflictAlgorithm: ConflictAlgorithm.ignore);
  }
}

final studentDbProvider = StudentDbProvider();

以下是我的集体课程

class StudentsBloc {

  final _repository = Repository();
  final _students = PublishSubject<StudentModel>();

  Observable<StudentModel> get students => _students.stream;

  fetchStudents(String disciplineId,String schoolId,String year_id,String lastIndex) async {


    await studentDbProvider.init();

    final student = await _repository.fetchStudents(disciplineId, schoolId, year_id, lastIndex);
    _students.sink.add(student);
  }

  clearCache(){
    return _repository.clearCache();
  }

  dispose(){
    _students.close();
  }


}

据我所知,错误一定是由于数据库初始化不当而发生的,但是当我执行第一个网络请求时,一切都工作正常,我在控制台中没有收到任何错误,并且数据库也已初始化。我无法理解为什么第二次之后会出现该错误?


我想你正在打电话snapshot.data.studentData在你的代码的某些部分。

在流构建器上,我倾向于首先进行空检查

if (snapshot.data != null) {
   // your code here
}

然后继续验证数据,否则您可以在 null 上使用 getterdata由提供StreamBuilder

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

StreamBuilder 抛出脏状态 的相关文章

随机推荐

  • WIndows API 中的“L”和“LPCWSTR”

    我发现 NetUserChangePassword 0 0 L ab L cd 将用户密码从 ab 更改为 cd 然而 NetUserChangePassword 0 0 LPCWSTR ab LPCWSTR cd 不起作用 返回值表示密码
  • 什么是“ANSI_X3.4-1968”编码?

    在我的系统上查看以下输出 STEP 101 python3 c import sys print sys stdout encoding ANSI X3 4 1968 STEP 102 STEP 103 locale LANG C LANG
  • 杰克编译花了很长时间

    升级我的项目以启用 Jack 和 Java8 功能后 我的 16GB MacBook 似乎无法再构建我的项目 我看到内存使用量越来越高 但进程总是卡在同一点 我的 Gradle 控制台 Executing tasks app assembl
  • 从 CDI Proxy 获取真实对象

    我寻找一种干净的 CDI 解决方案 而不是依赖于 WELD 的解决方案 但到目前为止一无所获 我需要测试我获得的对象列表中的每个元素是否 Inject Any MyInterfacebeans 是一个代理 当true我需要获取真实的对象进行
  • 在 Linux 中读取 USB 网络摄像头的输出

    我正在用 C 语言尝试一些 fread 和 fwrite 所以我用 C 语言编写了这个小程序 从网络摄像头获取数据并将其转储到文件中 以下为来源 include
  • 重新创建 Apple Watch 健身追踪器“进度”栏 - CAShapeLayer 笔划上的渐变

    我正在编写一个应用程序 可以充分利用 Apple Watch 的健身追踪器设计 如下 到目前为止 我已经创建了基本轮廓 它只是一个带有椭圆 CGPath 的 CAShapeLayer 我使用中风开始和中风结束来动画进度 我的问题出现在对轮廓
  • 如何处理锁(JPA)?

    根据Java 持久 锁定 wiki 书籍 http en wikibooks org wiki Java Persistence Locking Common Locking Mistakes 2C Questions and Proble
  • 如何在jetpack compose中设计多圆形进度条?

    我正在尝试使用 jetpack compose 设计一个显示多个进度的进度条 但我没有找到任何库或帮助材料 我只能设计一个进度条 但我需要设计像 只需使用多个CircularProgressIndicator里面一个Box Box cont
  • 有没有办法提高 Xcode 的代码完成能力?

    由于某种原因 不确定从什么时候开始 并不总是这样 但是 当我想写下NS词典 up to NSDi它在暗示我NSDirectoryEnumerationSkipsSubdirectory后代 在设计算法时 苹果的工程师肯定会使用一些 NSDi
  • 计算R中多个矩阵的平均值

    计算相同维度的多个矩阵的平均值的有效方法是什么 如果 A B 是 2 x 2 矩阵 那么 A 2 3 4 5 B 6 7 8 9 平均值 A B 应该给出 4 5 6 7 简单的方法是做 A B num 矩阵 并显式处理 NA 值 还有其他
  • 在 xml 文件中实例化内部类(Preference)

    当您想在某些情况下访问自定义视图时layout xml文件 您有两个选择 该视图属于它自己的类 然后你就做
  • 如何在Javascript中检测Safari 10浏览器?

    我正在使用 var isSafari constructor i test window HTMLElement 但它不适用于新的 Safari 10 关于使用什么有什么建议吗 Thanks edit 如何检测Safari Chrome I
  • 如何通过引用传递子字符串?

    我递归地调用一个函数 传递一个子字符串作为参数 该子字符串始终从当前字符串的开头开始直到一个位置 如果我使用 C 我可以将指针传递到字符串的第一个位置 然后传递必要的长度 尽管如此 我想使用该类获得相同的结果string 是否可以 如果我使
  • 如何检查 iTunes 上是否有新版本?

    我需要在 iTunes 上检查我的 iOS 应用程序版本 如果有新版本可用 我想显示 UIAlert 我不想在我的服务器上存储版本号 因为随时都有更新的版本可用 是否可以在 iTunes 上查看我的应用程序版本 对的 这是可能的 看看这个非
  • 斯坦福 NLP 分类器示例

    我正在尝试学习斯坦福 NLP 分类器 并希望研究文档分类问题 谁能推荐一个可以找到工作示例的地方 我还查看了 Open NLP 库 并找到了许多工作示例 例如 http tharindu rusira blogspot com 2013 1
  • data.table R 中的滞后列表[重复]

    这个问题在这里已经有答案了 shift in R s data table非常适合时间序列和时间窗口的东西 但列表的列不会像其他元素的列那样滞后 在下面的代码中 gearLag领先 滞后gear正确 但是gearsListLag不落后gea
  • 为什么C变量存储在特定的内存位置?

    昨天我参加了一次面试 面试官问我存储变量的存储类 我的回答战 Local Variables are stored in Stack Register variables are stored in Register Global stat
  • 在 LPCSTR 中附加 BSTR

    我有一个正在接收 BSTR 的类函数 在我的类中 我有一个成员变量 LPCSTR 现在我需要在 LPCSTR 中附加 BSTR 我怎样才能做到这一点 这是我的功能 void MyClass MyFunction BSTR text LPCS
  • WebRTC 数据通道未连接或未调用回调

    在尝试使用 Objective C API 建立 WebRTC 数据通道时 我无法实际捕获任何 RTCDataChannelDelegate 回调 关于对等连接 一切似乎都很顺利 但我只到达对等连接流已成功添加的程度 我的步骤大致是 创建报
  • StreamBuilder 抛出脏状态

    我正在尝试从互联网获取一些数据 将其存储到我的 sqlite 数据库中并使用ListView 当我第一次获取数据时 一切正常 并且我能够在屏幕上看到数据 数据也被插入到 sqlite 数据库中 但是当我重新打开应用程序时 我收到一条错误消息