Оператор возврата на карте с элементами: внутри Flutter DropdownButton, Почему и как это работает

Я новичок в Flutter и Dart. Я следую бесплатному руководству, но меня смущает, как есть оператор возврата в карте в элементах: в DropdownButton. Как это работает? Я ищу разъяснения относительно того, почему существует оператор return и куда он отправляет свое значение.

Я попытался выяснить, как оператор return находится на карте, но могу ошибаться в том, как задать этот вопрос. Код работает как указано, но я не уверен, как он работает. Существует ли пошаговая упрощенная форма этого кода, которая может привести к большему пониманию. Как сейчас "это над моей головой".

          DropdownButton<String>(

            items: _currencies.map(
                    (String dropDownStringItem) {

                   // interested in this return statement 
                  return DropdownMenuItem<String>(
                    value: dropDownStringItem,
                    child: Text(dropDownStringItem),
                  );
                }
            ).toList(),  //convert to List


            onChanged: (String newValueSelected) {
              _onDropDownItemSelected(newValueSelected);
            },

            value: _currentItemSelected,
          ),

person Michael    schedule 23.04.2019    source источник
comment
Если какой-либо из ответов был вам полезен, вы должны принять его. Спасибо   -  person Richard Heap    schedule 27.04.2019


Ответы (1)


Именование может сбить с толку кого-то нового, но позвольте мне немного объяснить вам опубликованный вами код:

Таким образом, конструктор DropdownButton ожидает список из DropdownMenuItem в качестве параметра, но в вашем случае у вас нет списка DropdownMenuItem, у вас есть список String. Вам нужен способ преобразования String в DropdownMenuItem, проще всего было бы сделать for над строками, создать новый DropdownMenuItem для каждого String, который у вас есть, добавить его в список и затем отправить в DropdownButton. Что-то вроде:

List<DropdownMenuItem> newGenerated = [];
_currencies.forEach((value) {
    DropdownMenuItem newItem = DropdownMenuItem<String>(
                                  value: dropDownStringItem,
                                  child: Text(dropDownStringItem),
                                 );
    newGenerated.add(newItem)
}
 DropdownButton<String>(
        items: newGenerated,  //convert to List
        onChanged: (String newValueSelected) {
          _onDropDownItemSelected(newValueSelected);
        },
        value: _currentItemSelected,
      ),

Приведенный выше код делает то же самое, что и ваш, но, на мой взгляд, не так уж и хорош.

Функция, которую вы используете map, используется для преобразования списка объектов в Iterable других элементов, применяя функцию к каждому элементу списка, который будет преобразован.

Следует иметь в виду, что карта преобразуется в Iterable, а не в список (вы не можете преобразовать Iterable в List), к счастью, Iterable имеет другой метод, называемый toList(), который преобразует его в List.

Теперь в вашем случае список, который необходимо преобразовать, - это _currencies, функция, которая применяется:

 (String dropDownStringItem) {

                   // interested in this return statement 
                  return DropdownMenuItem<String>(
                    value: dropDownStringItem,
                    child: Text(dropDownStringItem),
                  );

dropDownStringItem будет принимать значение каждого элемента в _currencies. return DropdownMenuItem ... вернет преобразованный объект

Надеюсь, это поможет.

person danypata    schedule 23.04.2019