Dart:枚举上的扩展方法不起作用“该方法未为类定义”

Dar*_*ath 2 extension-methods enums dart

基于这个问题,我在 dart 中创建了一个带有扩展方法的枚举:

enum TagVisibility {
  public,
  shared,
  private,
}

extension on TagVisibility {
  String get german {
    switch(this){
      case TagVisibility.public: return "Für alle sichtbar";
      case TagVisibility.shared: return "Für alle mit demselben Tag sichtbar";
      case TagVisibility.private: return "Nur für mich sichtbar";
      default: throw Exception("enum has more cases");
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是Error: The method 'german' isn't defined for the class 'TagVisibility'.当我尝试调用此扩展方法时出现错误:

import 'package:prototype/models/visibility.dart';
...
 DropdownButton<TagVisibility>(
          hint: Text("Wähle die Sichtbarkeit für diesen Tag"),
          value: _visibility ?? _visibilityDefault,
          onChanged: (visibility) {
            setState(() {
              _visibility = visibility;
            });
          },
          // items: List<DropdownMenuItem<TagVisibility>>(
          items: TagVisibility.values.map((visibility) => DropdownMenuItem(
            value: visibility,
            child: Text('${visibility.german()}'), // doesn't work
            // child: Text('${visibility.toString()}'), // works, but I want the custom messages.
          ),
          ).toList(),
        ),
Run Code Online (Sandbox Code Playgroud)

我完全不知道我在这里做错了什么。你能解释一下我如何让这个工作吗?谢谢!

Dar*_*ath 5

我在这里找到了解决方案:从 Dart 中的另一个文件导入扩展方法

\n

有两种方法:

\n

解决方案 1:将扩展方法放在使用它的 dart 文件中。\n但通常最好将扩展方法放在与相应枚举相同的文件中。所以我更喜欢这个:

\n

解决方案 2:为扩展指定一个与枚举名称不同的名称。代码:

\n
enum TagVisibility {\n  public,\n  shared,\n  private,\n}\n\nextension TagGerman on TagVisibility {\n  String get german {\n    switch(this){\n      case TagVisibility.public: return "F\xc3\xbcr alle sichtbar";\n      case TagVisibility.shared: return "F\xc3\xbcr alle mit demselben Tag sichtbar";\n      case TagVisibility.private: return "Nur f\xc3\xbcr mich sichtbar";\n      default: throw Exception("enum has more cases");\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n


lrn*_*lrn 5

您需要为扩展程序命名。

Dart 扩展可以在没有名称的情况下声明,但这只是意味着它们被赋予了一个新的私有名称,因此该扩展只能在声明它的库中访问。你基本上从不想要一个没有名字的扩展。

如果您给它一个公共名称,那么扩展名可以与枚举一起导入到其他库中。