如何在 Dart 中打开枚举?

i6x*_*x86 10 switch-statement dart flutter

我正在观看 The Boring Flutter Development Show,在其中一集中他们展示了 Bloc 的实现。

现在有这块代码,我认为最好用 Switch 语句替换,以防将来出现更多情况:

_storiesTypeController.stream.listen((storiesType) {
       if (storiesType == StoriesType.newStories) {
         _getArticlesAndUpdate(_newIds);
       } else {
         _getArticlesAndUpdate(_topIds);
       }
     });
Run Code Online (Sandbox Code Playgroud)

...所以我试图实现它,但它给了我一些错误说

switch 表达式的类型 'Type' 不能分配给 case 表达式的类型 'Stories Type'。

所以我想出了这个解决方法:

final storyType = StoriesType.newStories;

_storiesTypeController.stream.listen((storyType) {
    switch (storyType) {
      case StoriesType.newStories: {
        _getArticlesAndUpdate(_newIds);
      }
        break;
      case StoriesType.topStories: {
        _getArticlesAndUpdate(_topIds);
      }
        break;
      default: {
        print('default');
      }
    }
  });
Run Code Online (Sandbox Code Playgroud)

...一切正常,但我想知道是否有另一种方法可以切换 Enum 以及为什么当我在这一行中使用它时,它说未使用局部变量 storyType 的值:

_storiesTypeController.stream.listen((storyType)
Run Code Online (Sandbox Code Playgroud)

然后我切换过来?

cre*_*not 10

您有一个位于外部作用域中的冗余变量:

final storyType = StoriesType.newStories;
Run Code Online (Sandbox Code Playgroud)

由于 for 的回调_storiesTypeController.stream.listen定义了一个名为 的新变量storyType,因此不使用外部作用域中的变量。
您可以简单地删除冗余行:

final storyType = StoriesType.newStories;
Run Code Online (Sandbox Code Playgroud)

删除后,不应该有任何警告。
此外,您不需要在 -switch语句中使用大括号。调整后的代码如下所示:

_storiesTypeController.stream.listen((storyType) {
    switch (storyType) {
      case StoriesType.newStories:
        _getArticlesAndUpdate(_newIds);
        break;
      case StoriesType.topStories:
        _getArticlesAndUpdate(_topIds);
        break;
      default:
        print('default');
    }
  });
Run Code Online (Sandbox Code Playgroud)

您可以在Dart 的语言之旅 中找到更多关于switch的信息case