Как добавить строку в раскрывающуюся кнопку

#flutter #dart

Вопрос:

У меня есть карта<динамическая, строковая> с единицами измерения и именами.

 Map timeUnits = <dynamic, String>{
  TimeUnit.second: 'second',
  TimeUnit.minute: 'minute',
  TimeUnit.hour: 'hour',
  TimeUnit.day: 'day',
  TimeUnit.week: 'week',
  TimeUnit.month: 'month',
  TimeUnit.calendarYear: 'year',
};
 

Как добавить строку в раскрывающуюся кнопку? Кнопка раскрывающегося списка показывает эту проблему «Тип аргумента» Карта<динамическая, динамическая> «не может быть присвоен типу параметра «Список»».
Код раскрывающейся кнопки:

 child: DropdownButton(
              isExpanded: true,
              underline: Container(),
              value: currentUnits[widget.convertorType],
              icon: Padding(
                padding: const EdgeInsets.only(right: 8.0, bottom: 6),
                child: Image.asset("assets/icons/down-arrow2.png"),
              ),
              iconSize: 35,
              elevation: 20,
              style: TextStyle(
                fontSize: 18,
                color: Color.fromRGBO(114,137,218, 1)
              ),
              items: widget.items
                  .map(
                    (e) => DropdownMenuItem(
                      child: e == TimeUnit.calendarYear
                          ? Text("year")
                          : e.toString().length == 3
                              ? Text(e)
                              : Text(e.toString().split(".")[1]),
                      value: e,
                    ),
                  )
                  .toList(),
              onChanged: (newValue) {
                setState(() {
                  updateCurrentUnit(widget.convertorType, newValue);
                  widget.calculate();
                });
              },
            ),
 

Комментарии:

1. пожалуйста, добавьте, что определяет widget.item

Ответ №1:

Согласно моему пониманию, это связано с ошибкой (элементы: виджет.элемент), поэтому измените ее на (элементы: виджет.элементы.записи) и e на e.ключ или e.значение

  DropdownButton(
          isExpanded: true,
          underline: Container(),
          value: currentUnits[widget.convertorType],
          icon: Padding(
            padding: const EdgeInsets.only(right: 8.0, bottom: 6),
            child: Image.asset("assets/icons/down-arrow2.png"),
          ),
          iconSize: 35,
          elevation: 20,
          style: TextStyle(
            fontSize: 18,
            color: Color.fromRGBO(114,137,218, 1)
          ),
          items: widget.items.entries
              .map(
                (e) => DropdownMenuItem(
                  child: e.key == TimeUnit.calendarYear
                      ? Text("year")
                      : e.toString().length == 3
                          ? Text(e.key)
                          : Text(e.value),
                  value: e,
                ),
              )
              .toList(),
          onChanged: (newValue) {
            setState(() {
              updateCurrentUnit(widget.convertorType, newValue);
              widget.calculate();
            });
          },
        )
 

Комментарии:

1. показывает эту проблему: получатель «записи» не определен для типа » Список<динамический>». Попробуйте импортировать библиотеку, которая определяет «записи», исправив имя на имя существующего получателя или определив получатель или поле с именем «записи».

2. я начинаю сборку без записей, показывает, что «тип»_компакти-руемый<Строка>» не является подтипом типа » Список<Строка><динамический>»»

Ответ №2:

во-первых, вы должны преобразовать свою карту в список, затем создать список выпадающих меню, а затем отправить его в выпадающий виджет

например, в приведенном ниже коде провинции-это список, а элементы провинций-это список выпадающих меню. Я заполняю элементы провинций нужными мне элементами из списка провинций, а затем отправляю их в раскрывающийся виджет

 for (int i = 0; i < provinces.length; i  ) {
      provincesItems.add(DropdownMenuItem(
        value: i,
        child: Column(
          children: [
            Text(
              provinces[i].persianName,
              style: TextStyle(
                  color: Colors.black, fontWeight: FontWeight.normal),
            ),
          ],
        ),
      ));
    }