【问题标题】:The argument type 'List<Todo>? Function(QuerySnapshot<Object?>)' can't be assigned to the parameter type 'List<Todo> Function(QuerySnapshot<Object?>)'参数类型 'List<Todo>? Function(QuerySnapshot<Object?>)' 不能分配给参数类型 'List<Todo> Function(QuerySnapshot<Object?>)'
【发布时间】:2022-01-22 08:34:10
【问题描述】:

好的,所以基本上我有这个项目,我想为我的应用程序创建一个数据库,所以我像往常一样在我的项目中添加了 firebase,我创建了我的 database_service 文件,但如果 somoene 可以帮助我会出现这个错误像往常一样非常伟大。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:have_to/model/todo.dart';

class DatabaseService{
CollectionReference todosCollection = FirebaseFirestore.instance.collection("Todos");
Future createNewTodo(String title) async{
return await todosCollection.add({
  "title":title,
  "isComplet":false,
});
}
Future completTask(uid)async{
await todosCollection.doc(uid).update({"isComplet":true});
}

List<Todo>? todoFromFirestore(QuerySnapshot snapshot){
if(snapshot != null){
  snapshot.docs.map((e) {
    return Todo(uid: e.id,
      title: (e()["title"]),
      isComplet: e()["isComplet"],);
  }).toList();
  }else{
  return null;
     }
    }
  Stream<List<Todo>> listTodos() {
  return todosCollection.snapshots().map(todoFromFirestore);
   }
  }
              

【问题讨论】:

    标签: firebase flutter android-studio google-cloud-firestore


    【解决方案1】:

    您的信息流如下所示:

    Stream<List<Todo>> listTodos() {
      return todosCollection.snapshots().map(todoFromFireStore);
    }
    

    这意味着它将转到 firestore 并且对于每个文档,它将运行 todoFromFireStore 并返回一个待办事项列表。

    tod​​oFromFirestore 看起来像这样:

    List<Todo>? todoFromFirestore(QuerySnapshot snapshot){
      if(snapshot != null){
        // some code
      }
    }
    

    这里有三件重要的事情:

    1. 它返回List&lt;Todo&gt;?,这意味着它可以返回null,但是您的流是Stream&lt;List&lt;Todo&gt;&gt; 类型,这意味着它永远不会有空值。这是您的错误到达的地方。

    2. 查看方法上的代码,如果snapshot 为空,则返回空。 snapshotQuerySnapshot,它永远不会为空,因为它的类型不是 QuerySnapshot?

    3. 小事,但你错过了在你的方法上添加一个 return 语句,所以无论如何它实际上总是返回 null。

    所以如果你删除 if 语句,你改变了返回类型,你实际上返回了结果本身;错误会自行修复:

    List<Todo> todoFromFirestore(QuerySnapshot snapshot){
      return snapshot.docs.map((e) {
        return Todo(uid: e.id,
          title: (e()["title"]),
          isComplet: e()["isComplet"],);
        }).toList();
      }
    

    【讨论】:

      猜你喜欢
      • 2021-12-22
      • 2021-10-28
      • 2022-10-02
      • 2020-08-26
      • 2021-12-30
      • 2021-12-24
      • 2021-11-26
      • 1970-01-01
      • 2021-09-26
      相关资源
      最近更新 更多