如何在Flutter中将枚举绑定到DropdownButton?

31

有没有可能将下拉按钮绑定到枚举?我已经创建了一个枚举并尝试将其绑定到下拉按钮上,请参见以下代码。感谢任何关于此的帮助。

enum ClassType {
  Class-A,
  Class-B,
  Class-C,
  Class-D
}

DropdownButton<String>(
    value: classType,
    onChanged: (String newValue) {
        setState(() {
            viewModel.classType = newValue;
            });
        },
    items: ClassType.map((String classType) {
        return DropdownMenuItem<String>(
            value: classType,
            child: Text(classType),
        );
   }).toList(),
)
1个回答

48

首先,你需要将下拉按钮的类型参数更新为ClassType而不是String。在Dart中,枚举声明会创建一个新类型,而不是字符串。

DropdownButton(...);

接下来,你需要更改枚举名称。枚举必须是有效的Dart标识符,这意味着它不能包含符号-

enum ClassType {A, B, C, D}

我还更新了您的 map 方法,在您的枚举实例上没有静态迭代器,您需要将它们列出。此外,您需要手动将它们转换为字符串,可以通过调用 toString(将给出 "ClassType.A""ClassType.B")或编写自己的函数来完成。

return DropdownButton<ClassType>(
    value: classType,
    onChanged: (ClassType newValue) {
      setState(() {
        viewModel.classType = newValue;
      });
    },
    items: ClassType.values.map((ClassType classType) {
      return DropdownMenuItem<ClassType>(
        value: classType,
        child: Text(classType.toString()));
    }).toList();
);

Jonah,感谢您回答我的问题并提供示例。看起来我使用枚举作为下拉按钮并没有获得价值,因为我必须手动列出所有枚举项。再次感谢您的帮助。 - Edmand Looi
没问题。不幸的是,Dart枚举非常有限,因此最好使用字符串或const对象。 - Jonah Williams
1
@EdmandLooi 你可以将它改为 ClassType.values.map。这样你就不必手动列出它了。 - Rachit Rawat
这是正确的答案,但它缺少成员变量classType,而且在toList()后面不需要分号。ClassType classType = ClassType.A; .... toList() - DMacAttack
作为classType.toString()的替代方案,您可以使用Flutter函数describeEnum(classType),它会从classType.toString()中剥离枚举类名。 - kafran
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接