Например, у меня есть виджет Wrap, а в дочерних элементах у меня есть код вроде:
listTask.map((e) {
if (e.day!.contains(value))
return Padding(
padding: const EdgeInsets.all(4.0),
child: Container(
decoration: BoxDecoration(
shape: BoxShape.circle, color: Colors.black),
height: 20,
width: 20,
),
);
}).toList()
Я хочу, чтобы он возвращал Padding всякий раз, когда он передает оператор if, но получает ошибку The argument type 'List<Padding?>' can't be assigned to the parameter type 'List<Widget>'
. Как я могу это решить? Спасибо.
Проблема в том, что ваш обратный вызов List.map
ничего явно не возвращает, если условие if
не выполняется, поэтому обратный вызов неявно возвращает null
, и вы получаете List<Padding?>
вместо List<Padding>
. List.map
создает отображение 1:1 от входных элементов к выходным элементам.
Либо отфильтруйте элементы null
позже, либо используйте collection-for
с collection-if
:
[for (var e in listTask)
if (e.day!.contains(value))
Padding(...),
]
Также см.: Как преобразовать List<T?> в List в нулевом безопасном Dart?
Попробуй это :
listTask.map((e) {
return (e.day!.contains(value)) ? Padding(
padding: const EdgeInsets.all(4.0),
child: Container(
decoration: BoxDecoration(
shape: BoxShape.circle, color: Colors.black),
height: 20,
width: 20,
),
):Container();
}).toList()
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, такие как цитаты или документация, чтобы другие могли подтвердить правильность вашего ответа. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
Да, я понимаю, что у меня нет другого утверждения, и ваш ответ великолепен!