Я пытаюсь динамически добавлять в виджет строки, которые будут меняться в зависимости от того, сколько элементов содержит массив.
Однако я столкнулся со следующей ошибкой во втором операторе списка (все внутри цикла for):
The element type 'Set<_ExerData>' can't be assigned to the list type 'Widget'
Есть ли у кого-нибудь решение этой проблемы? Вот блок кода, в котором он выполняется:
Flexible(
child: Column(
children: [
...[
ExerTitle(title, leftEdgeInset, 112),
]
.map((menu) => _ExerTitle(
title: menu.title,
leftEdgeInset: menu.leftEdgeInset,
time: menu.time,
)),
for (int i = 0; i < exerArr.length; i++) {
...[
ExerData(exerArr[i], setsArr[i], leftEdgeInset),
]
.map((menu) => _ExerData(
exer: menu.exer,
sets: menu.sets,
leftEdgeInset: menu.leftEdgeInset,
)),
}
],
),
),
Этот блок кода находится внутри контейнера и должен отображать данные для каждой итерации из ExerData внутри Column().
@pskink Это здорово, спасибо. Но почему в таком случае мне не нужны фигурные скобки?
ну, в цикле Collection-for выдается значение, следующее за for
- в вашем случае это было Set
- что-то вроде { element }
- это не то, что вы имели в виду
@user25674912 user25674912, потому что это не цикл for, это выражение «коллекция for»: dart.dev/language/collections#control-flow-operators (и для этого не требуются фигурные скобки... поэтому фигурные скобки, которые вы добавили как уже указывалось, мы просто создаем набор).
Ошибка, которую вы получаете, связана с тем, что вы пытаетесь «разложить» Set<_ExerData>
на List<Widget>
, ошибка, которую вы получили, довольно ясна в этом отношении. Но неясно, откуда взялся этот Set
, потому что вы, по сути, допускаете «грамматическую» ошибку в своем коде Dart.
Синтаксис:
[...foo]
предназначен для распределения значения коллекции foo
внутри создаваемого списка с помощью квадратных скобок.
Внутри буквального списка вы также можете использовать «для коллекции»:
void main() {
const mySet = {'abc', 'def'};
final list = ['hi', for (final v in mySet) '\n* $v'];
print(list.join());
}
Это печатает:
hi
* abc
* def
В своем коде вы путаете вещи... во-первых, вы используете и оператор распространения, и сбор-для... но вы также пытаетесь собирать наборы в своей коллекции-для, что, я считаю, является непонимание с вашей стороны по поводу коллекции-форс.
Этот код должен проиллюстрировать проблему:
void main() {
print([for (final v in [1, 2, 3]) { v }]);
}
Это напечатает:
[{1}, {2}, {3}]
Каждое значение списка было заключено в Set
, потому что выражения collection-for
не принимают блок, а только циклы for! Итак, фигурные скобки внутри коллекции for — это просто Set
в буквальном смысле.
В приведенном выше примере {1}
— это Set
, содержащий элемент 1
.
Я не уверен, почему вы сопоставляете список из одного элемента, поскольку в этом нет необходимости, если у вас есть только один элемент... но если мы сохраним это сопоставление (при условии, что вы можете добавить больше элементов в будущем??), код должно выглядеть примерно так:
final widgets = [
...[
ExerTitle(title, leftEdgeInset, 112),
].map((menu) => _ExerTitle(
title: menu.title,
leftEdgeInset: menu.leftEdgeInset,
time: menu.time,
)),
for (int i = 0; i < exerArr.length; i++)
...[
ExerData(exerArr[i], setsArr[i]),
].map((menu) => _ExerData(
exer: menu.exer,
sets: menu.sets,
))
];
из
for (int i = 0; i < exerArr.length; i++) {
убрать{
фигурную скобку (и, конечно, соответствующую}
тоже)