Как решить К свойству 'length' нельзя получить безоговорочный доступ, потому что получатель может быть 'null'

Я также добавил условия, чтобы получатель не был нулевым, но ошибка сохраняется. Это 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'];

             

person Sakshi Khatod    schedule 16.05.2021    source источник


Ответы (2)


Это связано с нулевой безопасностью Dart. Один из способов решить эту проблему - использовать оператор bang, поскольку вы уверены, что noteData.data никогда не имеет значения null (вы проверяете это перед использованием), например:

noteData.data!.length, noteData.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,
        ...
      ),
    ),
  );
}
person mkobuolys    schedule 16.05.2021
comment
Не сработало. Снова показала ту же ошибку. Я тоже использовал оператор взрыва, но он вызвал ту же проблему. - person Sakshi Khatod; 16.05.2021
comment
Тогда, может быть, оператор взрыва нужен и после noteData? Помогло бы, если бы вы разместили код метода getNotes(). - person mkobuolys; 16.05.2021
comment
Я добавил код. Пожалуйста, проверьте @mkobuolys - person Sakshi Khatod; 16.05.2021
comment
О, я понимаю ... Прежде всего, вам следует реорганизовать свой код, чтобы он возвращал List ‹NoteModel›, а не динамический, с этим будет легче справиться позже. - person mkobuolys; 16.05.2021
comment
Я переустановил флаттер, и все заработало. - person Sakshi Khatod; 17.05.2021


  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;
    }
  }

и это мой класс Note

class NoteModel {
  final int? id;
  final String? title;
  final String? body;
  final DateTime? creation_date;

  NoteModel({this.id, this.title, this.body, this.creation_date});

  Map<String, dynamic> toMap() {
    return ({
      "id": id,
      "title": title,
      "body": body,
      "creation_date": creation_date
    });
  }
}
person Sakshi Khatod    schedule 16.05.2021