类型 'List<Widget?>' 不是类型转换中类型 'List<Widget>' 的子类型

type 'List<Widget?>' is not a subtype of type 'List<Widget>' in type cast

在 运行 dart migrate 并应用空安全之后,我的代码中出现了该错误,我认为这是导致代码块的错误。

LayoutBuilder(builder: (context, cons) {
  return GestureDetector(
    child: new Stack(
      children: <Widget?>[
        // list of different widgets 
        .
        .
        .
      ].where((child) => child != null).toList(growable: true) as List<Widget>,
    ),
  );
),

错误消息说:

The following _CastError was thrown building LayoutBuilder:
type 'List<Widget?>' is not a subtype of type 'List<Widget>' in type cast

The relevant error-causing widget was
LayoutBuilder
package:projectName/…/components/fileName.dart:182

如果有人遇到这个问题,如何解决?

不是 Dart 专家。

但编译器似乎不尊重您的空安全检查。

我建议创建一个新的 List<Widget> 并用 List<Widget?> 中不为空的每个项目填充它。

你不能使用asList<T?>转换为List<T>,因为它们不是直接相关的类型;您需要使用 List<Widget>.from() or Iterable.cast<Widget>().

来转换 elements

请参阅 了解如何从 List<T?> 中删除 null 元素, 得到 List<T> 结果(因此避免以后需要投射)。

尽管有不同的方法可以解决 by @jamesdlin but the recommended one is to use whereType。例如:

List<Widget?> nullableWidgets = [];
List<Widget> nonNullable = nullableWidgets.whereType<Widget>().toList();

回答你的问题:

Stack(
  children: <Widget?>[
    // Widgets (some of them nullable)
  ].whereType<Widget>().toList(),
)