Я получаю [] не определено для ошибки объекта в dart, когда я пытаюсь следовать этому учебнику по Flutter Firebase?

# #firebase #flutter #dart #google-cloud-firestore

Вопрос:

 List<Sport?> _sportListFromSnapshot(QuerySnapshot snapshot){
    return snapshot.docs.map((doc){
      return Sport(
         name: doc.data['name'] ?? '',
         sport: doc.data['sport'] ?? '',
         age: doc.data['age'] ?? 0
      );

    }).toList();
}
 

Я получаю эту ошибку под [«имя»], [«спорт»] и [«возраст»], и я не знаю, как это исправить, потому что для парня в учебнике это не дает ему этой ошибки?

Это мой спортивный класс:

 class Sport {
   final String name;
   final String sport;
   final int age;

   Sport({required this.name, required this.sport, required this.age});
}
 

Комментарии:

1. Можете обновить свой вопрос, и вы вставите точную ошибку в блок кода?

Ответ №1:

На основе документации QuerySnapshot на самом деле тип QuerySnapshot<T extends Object?> , поэтому весь анализатор знает, что каждое data свойство для каждого документа является Object как минимум. Вам необходимо предоставить дополнительную информацию, либо определив общее, например:

 List<Sport?> _sportListFromSnapshot(QuerySnapshot<Map<String, dynamic>> snapshot){ ...
 

Или бросьте его в тело обратного вызова, например:

 List<Sport?> _sportListFromSnapshot(QuerySnapshot snapshot){
    return snapshot.docs.map((doc){
      final data = doc.data as Map<String, dynamic>;
      return Sport(
         name: data['name'] ?? '',
         sport: data['sport'] ?? '',
         age: data['age'] ?? 0
      );

    }).toList();
}
 

В учебнике, вероятно, были смягчены правила анализатора, что, на мой взгляд, оказывает медвежью услугу аудитории.

Комментарии:

1. Это не исправило мою ошибку, может быть, потому, что возраст не является строковой переменной?