Dart:枚举上的扩展方法不';t工作“;方法是';为类定义的t“;

Dart:枚举上的扩展方法不';t工作“;方法是';为类定义的t“;,dart,enums,extension-methods,Dart,Enums,Extension Methods,basend我使用扩展方法在dart中创建了一个枚举: 枚举标记可见性{ 公众,, 共享, 私有的 } 标记可见性的扩展{ 我懂德语{ 开关(本){ case TagVisibility.public:返回“Für alle sichtbar”; case TagVisibility.shared:返回“Für alle mit demselben Tag sichtbar”; case TagVisibility.private:返回“Nur für mich sichtbar”; 默认值:抛

basend我使用扩展方法在dart中创建了一个枚举:

枚举标记可见性{
公众,,
共享,
私有的
}
标记可见性的扩展{
我懂德语{
开关(本){
case TagVisibility.public:返回“Für alle sichtbar”;
case TagVisibility.shared:返回“Für alle mit demselben Tag sichtbar”;
case TagVisibility.private:返回“Nur für mich sichtbar”;
默认值:抛出异常(“枚举有更多事例”);
}
}
}
但是我得到了错误:没有为类“TagVisibility”定义方法“german”。当我尝试调用此扩展方法时:

导入“包:原型/模型/可见性.dart”; ... 下拉按钮( 提示:文本(“Wähle die Sichtbarkeit für diesen标签”), 值:\u可见性???\u可见性默认值, 一旦更改:(可见性){ 设置状态(){ _能见度=能见度; }); }, //项目:清单( 项目:TagVisibility.values.map((可见性)=>DropdownMenuItem( 价值:可见度, child:Text(“${visibility.german()}”),//不起作用 //child:Text('${visibility.toString()}'),//有效,但我需要自定义消息。 ), ).toList(), ), 我完全不知道我在这里做错了什么。你能解释一下我如何才能让它工作吗?Thx!

你定义为getter:

。。。
我懂德语{
...
但用它作为方法:

。。。
child:Text(“${visibility.german()}”),//不起作用
...
您应该做的是将其用作getter:

。。。
child:Text(“${visibility.german}”),//应该可以这样做
...

我在这里找到了解决方案:

有两种方法:

解决方案编号1:将扩展方法放置在dart中,在dart中使用扩展方法。 但通常最好将扩展名方法与相应的枚举放在同一个文件中。因此我更喜欢这样:

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

枚举标记可见性{
公众,,
共享,
私有的
}
基于标记可见性的扩展标记{
我懂德语{
开关(本){
case TagVisibility.public:返回“Für alle sichtbar”;
case TagVisibility.shared:返回“Für alle mit demselben Tag sichtbar”;
case TagVisibility.private:返回“Nur für mich sichtbar”;
默认值:抛出异常(“枚举有更多事例”);
}
}
}

您需要为扩展名命名

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

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

另一种方法

enum TagVisibility {
  public,
  shared,
  private,
}

extension TagGerman on TagVisibility {
  String get german {
     var values= ["Für alle sichtbar",
                  "Für alle mit demselben Tag sichtbar",
                  "Nur für mich sichtbar"];
      return values.elementAt(index);
    }
  }
}
始终在每个要使用的位置添加导入“…/your_file.dart”

别忘了测试!!!如果添加更多枚举项,请小心RangeError异常

 group('Tag Visibility German', () {

    test('public german should be Für alle sichtbar', () {
      expect('Für alle sichtbar', TagVisibility.public.german());
    });
     ...

  });

哦,对了。我以前试过这个,但得到了错误:getter'german'没有为类'TagVisibility'定义。(未定义的getter位于[prototype]lib\gui\screens\register\6\u register\u list\u of theu interest.dart:70)这很可能是因为扩展源没有导入到您使用它的库中。查看谁的源代码具有确切的文件和导入会更有帮助,从而更好地帮助您。可见性.dart文件没有导入。其他文件的导入为
dart import'package:flatter/material.dart';//本地文件导入导入“包:prototype/gui/corporate_design.dart”;导入“包:prototype/controller/IController.dart”;导入“包:prototype/controller/controller.dart”;导入“包:prototype/models/Tag.dart”;导入“包:prototype/models/visibility.dart”;
我认为,只有问题中给出的答案是相关的。为什么它不会在代码中的注释中换行?---我很高兴您找到了解决方案,但从技术上讲,这个答案并没有回答或解决本文实际问题中描述的问题,即:“错误:没有为类‘TagVisibility’定义方法‘german’。”。它解决了不正确导入扩展名的问题。所以我建议您要么更改原始的帖子描述(这不公平),或以不同的问题发布不同的问题。这只是为了避免混淆阅读您原始帖子的其他人和可能的解决方案。命名扩展实际上是正确的解决方案,因为扩展成员
德语
在导入枚举和扩展的库中不可用,它解决了问题。