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

问题描述 投票:0回答:3

basend this Question我用扩展方法在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");
    }
  }
}

但是当我尝试调用此扩展方法时出现错误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(),
        ),

我绝对不知道我在这里做错了什么。您能给我解释一下我该如何工作吗?谢谢!

dart enums extension-methods
3个回答
1
投票

我在这里找到了解决方案:Import extension method from another file in Dart

有两种方法:

解决方案编号1:将扩展方法放在使用它的飞镖中。

解决方案编号2:为扩展名提供与枚举名称不同的名称。


0
投票

您定义为吸气剂:

...
String get german {
...

但将其用作方法:

...
child: Text('${visibility.german()}'), // doesn't work
...

您应该做的是将其用作吸气剂:

...
child: Text('${visibility.german}'), // this should work
...

0
投票

您需要给扩展名起一个名字。

Dart扩展名可以不使用名称声明,但这只是意味着它们将被赋予一个新的private名称,因此,它仅在声明该名称的库中起作用。您基本上从不希望没有名称的扩展名。

© www.soinside.com 2019 - 2024. All rights reserved.