Dart: метод расширения для enum не работает "Метод не определен для класса" - PullRequest
0 голосов
/ 22 марта 2020

basend этот вопрос Я создал перечисление в 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(),
        ),

Я понятия не имею, что я здесь не так сделал. Не могли бы вы объяснить мне, как я могу заставить это работать? Thx!

Ответы [ 3 ]

1 голос
/ 22 марта 2020

Я нашел решение здесь: Импортировать метод расширения из другого файла в Dart

Существует два способа:

Решение № 1: Поместите метод расширения в дротик, где он используется. Но часто лучше поместить метод расширения в тот же файл, что и соответствующее перечисление. Поэтому я предпочитаю следующее:

Решение № 2: Дайте добавочному номеру имя, которое отличается от имени перечисления. Код:

enum TagVisibility {
  public,
  shared,
  private,
}

extension TagGerman 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");
    }
  }
}
0 голосов
/ 23 марта 2020

Вам нужно дать расширению имя.

Расширения Dart могут быть объявлены без имени, но это просто означает, что им вместо этого дано имя fre sh private , и поэтому расширение доступно только внутри библиотеки, в которой оно объявлено. По сути, вам никогда не нужно расширение без имени.

Если вы дадите ему публичное c имя, то расширение может быть импортировано в другие библиотеки вместе с перечислением.

0 голосов
/ 22 марта 2020

Вы определили как получатель:

...
String get german {
...

, но используете его как метод:

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

Что вам нужно сделать, это использовать его как получатель:

...
child: Text('${visibility.german}'), // this should work
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...