Как динамически выполнять list.map внутри виджета (Dart/Flutter)

Я пытаюсь динамически добавлять в виджет строки, которые будут меняться в зависимости от того, сколько элементов содержит массив.

Однако я столкнулся со следующей ошибкой во втором операторе списка (все внутри цикла 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().

из for (int i = 0; i < exerArr.length; i++) { убрать { фигурную скобку (и, конечно, соответствующую } тоже)

pskink 22.06.2024 12:17

@pskink Это здорово, спасибо. Но почему в таком случае мне не нужны фигурные скобки?

user25674912 22.06.2024 12:57

ну, в цикле Collection-for выдается значение, следующее за for - в вашем случае это было Set - что-то вроде { element } - это не то, что вы имели в виду

pskink 22.06.2024 13:24

@user25674912 user25674912, потому что это не цикл for, это выражение «коллекция for»: dart.dev/language/collections#control-flow-operators (и для этого не требуются фигурные скобки... поэтому фигурные скобки, которые вы добавили как уже указывалось, мы просто создаем набор).

Renato 24.06.2024 14:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка, которую вы получаете, связана с тем, что вы пытаетесь «разложить» 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,
          ))
  ];

Другие вопросы по теме