【问题标题】:The argument type 'List<dynamic>?' can't be assigned to the parameter type 'List<dynamic>'参数类型 'List<dynamic>?'不能分配给参数类型“列表<动态>”
【发布时间】:2021-09-10 08:27:56
【问题描述】:

目前,我正在更新基于以前版本开发的 Flutter 项目的代码库。一旦我们更新到最新版本的 Dart 和 Flutter,就会发生错误。

这里的代码与我们从FutureBuilder返回列表时有关。

          body: new FutureBuilder<List>(
            future: getData(),
            builder: (context, snapshot) {
              if (snapshot.hasError) print(snapshot.error);

              return snapshot.hasData
                  ? new ItemList(
                      list: snapshot.data, <--- error in here
                    )
                  : new Center(
                      child: new CircularProgressIndicator(),
                    );
            },
          ),

Flutter 版本:2.2.2

飞镖版本:2.13.3

请帮我指出我应该注意哪一部分。 谢谢!

【问题讨论】:

  • 在您迁移到 dart NNBD 之前,它是否与 Flutter 2.2 一起工作?不要告诉我你错误地试图同时做这两个....
  • 是的,在我更新到 NNBD 版本之前它就可以工作。 @RandalSchwartz
  • 您完成了完整的“验证升级版本”和“dart 迁移”步骤?

标签: flutter dart flutter-futurebuilder null-safety


【解决方案1】:

这是 Dart 添加的新 null-safety 功能引起的错误。

根据您希望如何处理ItemList 中的null 值,您应该更新ItemList 中的代码以接受null(即将list 定义为List? list)或更新snapshot.datasnapshot.data?? 并提供snapshot.datanull 时的值。

补充阅读:

  1. 您可以阅读更多关于它的信息here
  2. 您还可以按照指南迁移到空安全here

【讨论】:

  • 不客气,这只是一个简短的例子和一个快速的答案。请阅读更多关于空安全性的内容(答案中的链接)。您需要更新的代码更有可能是ItemList 而不是FutureBuilder
【解决方案2】:

您的snapshot.data 可以为空,但ItemList 类的list 不接受任何null 值。这就是您收到此错误的原因。

如果您可以确保snapshot.data 始终为非空值,那么您应该使用snapshot.data! 来避免此错误。但是,如果有任何机会 snapshot.data 可以为空,那么 snapshot.data! 会给你另一个例外。在这种情况下,您应该使用

ItemList(
           list: snapshot.data??[],
         )

【讨论】:

  • 这解释了很多。谢谢!
猜你喜欢
  • 2021-11-29
  • 2021-10-24
  • 2021-09-15
  • 2021-10-18
  • 2021-11-13
  • 2021-12-24
  • 2020-10-11
  • 1970-01-01
  • 2019-10-05
相关资源
最近更新 更多