Не уверен, почему это выражение if не работает:
Widget build(BuildContext context) {
return Container(
child: Column(
children: <Widget>[
if (text.length > 0) {
for (var val in text) Center(child: etc..)
}
],
),
)
Код в операторе if (на данный момент удален) отлично работает без оператора if, но как только я добавляю его, я получаю сообщение об ошибке The element type 'Map' can't be assigned to the list type 'Widget'.
Как мне составить этот оператор if внутри виджета? Я понимаю, что это внутри оператора return, но не уверен, почему цикл for подходит, а оператор if — нет.
@danypata О, верно .... так просто, а? Я собирался сказать, это выглядело достаточно хорошо для меня. Я не видел, в чем проблема.
@casraf А что, если это какой-то длинный многострочный оператор внутри оператора if? Без фигурных скобок это было бы немного сложно.
длина текста > 0? for (var val в тексте) Center(child: etc..) : null также должен работать, но опять же, это может быть сложно, если оператор длинный
@Can Taşpınar Итак, что делать, если заявление длиннее? В данном случае это не проблема, но для дальнейшего использования.
@Hasen Ну, вы можете создать функцию и передать ее в качестве параметров, если это необходимо. Внутри этой функции можно обрабатывать сложную логику или длинные операторы. В конце он вернет true или false, поэтому простая строка, такая как check(foo) ? Контейнер(); ноль будет работа.
@Hasen Хорошо, единственный способ - создать функцию, мы в основном ограничены одним вкладышем непосредственно в виджете. Хорошо понял.





Вы должны удалить фигурные скобки из if. Затем вы добавляете фигурные скобки в список, который интерпретируется как карта.
for loop подходит для коллекции, потому что это новая функция Дартс (начиная с версии 2.3). Например, следующий фрагмент генерирует новый список квадратов:
var numbers = [1, 2, 3, 4, 5];
var squares = [for (var n in numbers) n * n];
print(squares); // [1, 4, 9, 16, 25]
if внутренняя коллекция также является новой для Dart 2.3 и позволяет фильтровать элементы:
bool includeZero = false;
var all = [if (includeZero) 0, 1, 2, 3, 4, 5];
print(all); // [1, 2, 3, 4, 5]
Вы даже можете комбинировать обе конструкции:
var includeSquares = true;
var allWithSquares = [
...numbers,
if (includeSquares) for (var n in numbers) n * n
];
print(allWithSquares); // [1, 2, 3, 4, 5, 1, 4, 9, 16, 25]
Единственное, что вы не можете сделать, это использовать фигурные скобки в качестве блоков кода внутри коллекций. Вы по-прежнему можете использовать фигурные скобки, чтобы определить Map как элемент. В вашем случае фигурные скобки дают следующий результат:
var includeSquares = true;
var allWithSquares = [
...numbers,
if (includeSquares) {for (var n in numbers) n * n}
];
print(allWithSquares); // [1, 2, 3, 4, 5, {1, 4, 9, 16, 25}]
Подробнее о новых функциях Dart можно прочитать здесь
Если операторы внутри виджетов не имеют фигурных скобок. Удалите
{}для оператора if