如何解决“无法无条件访问属性'length',因为接收器可以为'null'”

时间:2021-05-16 11:22:55

标签: flutter dart sqflite

我也为接收者添加了条件,使其不为空,但错误仍然存​​在。这是我无法解决的 2 个错误。请帮助!我正在制作“Notes”应用程序,我将值存储在 sqflite db 中。

        body: FutureBuilder(
          future: getNotes(),
          builder: (context, noteData) {
            switch (noteData.connectionState) {
              case ConnectionState.waiting:
                {
                  return Center(child: CircularProgressIndicator());
                }
              case ConnectionState.done:
                {
                  if (noteData.data == null) {
                    return Center(
                      child: Text("You don't have any notes yet, create one!"),
                    );
                  } else {
                    return Padding(
                      padding: EdgeInsets.all(8.0),
                      child: ListView.builder(
                         itemCount: noteData.data.length,   //Error
                        itemBuilder: (context, index) {
                          String title = noteData.data[index]['title'];// Error-The method '[]' can't be 
                                                                  //unconditionally invoked because the receiver //can be 'null'.
                          String body = noteData.data[index]['body'];
                          String creation_date =
                              noteData.data[index]['creation_date'];
                          int id = noteData.data[index]['id'];

             

2 个答案:

答案 0 :(得分:0)

这与 Dart 空安全有关。解决此问题的一种方法是使用 bang 运算符,因为您确定 noteData.data 永远不会为空(您在使用前正在检查),例如:

noteData.data!.lengthnoteData.data![index]['title'] 等。

这个解决方案看起来很麻烦,所以我建议在使用 noteData.data 之前创建一个局部变量:

...
} else {
  final data = noteData.data; // noteData.data! could be needed here, not sure

  return Padding(
    padding: EdgeInsets.all(8.0),
      child: ListView.builder(
        itemCount: data.length,
        ...
      ),
    ),
  );
}

答案 1 :(得分:0)

xargs -n2

这是我的笔记类


  Future<dynamic> getNotes() async {
    final db = await database;
    var res = await db!.query("notes");
    if (res.length == 0) {
      return null;
    } else {
      var resultMap = res.toList();
      return resultMap.isNotEmpty ? resultMap : null;
    }
  }