Flutter 中 DropdownButton 的列表理解(Dart)

List Comprehension for DropdownButton in Flutter (Dart)

我目前正在学习 Flutter 并想用以下列表创建一个 DropdownButton

const List<String> currenciesList = [
  'AUD',
  'BRL',
  'CAD',
  'CNY',
  'EUR',
];

DropdownButton 小部件的 item 属性需要一个列表。因此,我想通过使用列表理解来清理代码。我编写了以下函数来根据给定的字符串创建 DropdownMenuItem

DropdownMenuItem makeDropdownMenuItem (String currency) {
  DropdownMenuItem item = DropdownMenuItem(
    child: Text(currency),
    value: currency,
  );
  return item;
}

不幸的是,当我使用我发现 here 的列表理解语法时,我得到一个错误:

child: DropdownButton<String>(
              value: selectedCurrency,
              items: currenciesList.map((currency) => makeDropdownMenuItem(currency)).toList(),
              onChanged: (value) {
                setState(() {
                  selectedCurrency = value;
                });
            },

type 'List<DropdownMenuItem>' is not a subtype of type 'List<DropdownMenuItem>?'

谁能帮我解决这个问题?非常感谢!

DropdownMenuItem 是泛型 class,因此您必须在 makeDropdownMenuItem 函数中明确指定实际类型:

DropdownMenuItem<String> makeDropdownMenuItem(String currency) {
  final item = DropdownMenuItem(
    child: Text(currency),
    value: currency,
  );
  return item;
}

首先,

Unfortunately, when I use the list comprehension syntax I found, I get an error:

这不是新的列表理解。这是:

child: DropdownButton<String>(
  value: selectedCurrency,
  onChanged: (value) => setState(() => selectedCurrency = value),
  items: [
    for (final currency in currenciesList)
      makeDropdownMenuItem(currency)
  ],
)

我发现它更简洁,您也可以添加 if 或嵌套 for 循环。


然后,正如@Midhun 所说,您需要将函数标记为返回 DropdownMenuItem<String>。或者,您可以继续使用您的列表理解:

child: DropdownButton<String>(
  value: selectedCurrency,
  onChanged: (value) => setState(() => selectedCurrency = value),
  items: [
    for (final currency in currenciesList) DropdownMenuItem(
      child: Text(currency),
      value: currency,
    );
  ],
)