如何在 Dart 中公开全局枚举?

Lau*_*ent 5 dart flutter

enum Category{ restaurant, pizzera, fast_food, other }

class XXX ...
Run Code Online (Sandbox Code Playgroud)

如何从其他类静态访问XXX.Category?

非常感谢您抽出时间;-)

Abi*_*n47 6

无法以所有其他文件自动访问它的方式将文件、类、枚举或其他方式公开给全局 Dart上下文。您可以将其创建为全局资源,然后将其显式导入到需要它的其他文件中。

(myEnum.dart)

enum MyEnum {
  value1,
  value2,
  value3,
}
Run Code Online (Sandbox Code Playgroud)

(主要.dart)

import 'relative/path/to/file/myEnum.dart'; // Load the contents of myEnum.dart into this file's scope

void main() {
  var e = MyEnum.value1;
  // Do whatever else you want with MyEnum
}
Run Code Online (Sandbox Code Playgroud)

重新阅读问题后,似乎您真正想要的是将枚举声明为静态类的成员,即这样您就可以使用语法引用它ClassName.EnumName.value。遗憾的是,Dart 不支持嵌套类型。(您不能在另一个类中声明一个类或枚举。)

您可以使用一种解决方法来提供相同的语法结果,但我想郑重声明,不建议这样做,而且绝对会让事情变得比需要的更复杂。

(foo.dart)

enum _MyEnum {
  value1,
  value2,
  value3,
  value4,
}

class _MyEnumContainer {
  _MyEnum get value1 => _MyEnum.value1;
  _MyEnum get value2 => _MyEnum.value2;
  _MyEnum get value3 => _MyEnum.value3;
  _MyEnum get value4 => _MyEnum.value4;
}

class Foo {
  static _myEnumContainerInstance = _MyEnumContainer();
  static _MyEnumContainer get MyEnum => _myEnumContainerInstance;
}
Run Code Online (Sandbox Code Playgroud)

(主要.dart)

import 'foo.dart';

void main() {
  var e = Foo.MyEnum.value1;
}
Run Code Online (Sandbox Code Playgroud)

或者(更推荐),您也可以使用标签从第一个示例中导入文件。当然,这纯粹是一个装饰选项,并且没有办法强制执行,但从语法上讲,它实现了您想要的。

import 'myEnum.dart' as Foo;

void main() {
  var e = Foo.MyEnum.value1;
}
Run Code Online (Sandbox Code Playgroud)