参数类型 'List<Todo>? Function(QuerySnapshot<Object?>)' 不能分配给参数类型 'List<Todo> Function

Posted

技术标签:

【中文标题】参数类型 \'List<Todo>? Function(QuerySnapshot<Object?>)\' 不能分配给参数类型 \'List<Todo> Function(QuerySnapshot<Object?>)\'【英文标题】: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);
   
  
              

【问题讨论】:

【参考方案1】:

您的信息流如下所示:

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

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

tod​​oFromFirestore 看起来像这样:

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

这里有三件重要的事情:

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

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

    小事,但你错过了在你的方法上添加一个 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();
  

【讨论】:

以上是关于参数类型 'List<Todo>? Function(QuerySnapshot<Object?>)' 不能分配给参数类型 'List<Todo> Function的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 参数类型 'List<dynamic>' 不能分配给参数类型 'List<Widget>'

[JavaScript实例解析]简易TODO List

参数类型“Stream<List<ObjectModel>>”不能分配给参数类型“List<ObjectModel>”

vue-11实战todo list 本地存储-自学视频教

颤振错误:参数类型“列表<动态>?”无法分配给参数类型'List<Movie>' [关闭]

参数类型“List<dynamic>”不能分配给参数类型“List<Widget>”。我究竟做错了啥?小飘飘在这里