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

936

Solution 1

You cannot use as to cast List<T?> to List<T> because they are not directly related types; you would need to cast the elements instead, using List<Widget>.from() or Iterable.cast<Widget>().

See Dart convert List<String?> to List nnbd for how to remove null elements from a List<T?> and get a List<T> result (and thus avoiding the need to cast later).

Solution 2

Although there are different ways to solve it as provided here by @jamesdlin but the recommended one is to use whereType. For example:

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

To answer your question:

Stack(
  children: <Widget?>[
    // Widgets (some of them nullable)
  ].whereType<Widget>().toList(),
)
Share:
936
Mahmoud Hassan Al-Ridini
Author by

Mahmoud Hassan Al-Ridini

Updated on December 28, 2022

Comments

  • Mahmoud Hassan Al-Ridini
    Mahmoud Hassan Al-Ridini over 1 year

    After running dart migrate & applying null safety, that error popped up at my code and I think that's the error causing code block.

    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 error message says:

    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
    

    If anyone encountered this issue, how it can be solved?