How to switch on Enum in Dart?

12,638

You have a redundant variable that lives in the outer scope:

final storyType = StoriesType.newStories;

Since the callback for _storiesTypeController.stream.listen defines a new variable named storyType, the variable from the outer scope is not used.
You can simply drop the redundant line:

final storyType = StoriesType.newStories;

After you have removed it, there should not be any warnings.
Additionally, you do not need curly braces in a switch-statement. The adjusted code would look like this:

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

You can find out more about switch and case in Dart's language tour.

Share:
12,638
i6x86
Author by

i6x86

aprendiendo a crear aplicaciones para iPhone.

Updated on June 04, 2022

Comments

  • i6x86
    i6x86 almost 2 years

    I'm watching The Boring Flutter Development Show where in one of the episodes they're showing the implementation of Bloc.

    Now there's this chunk of code that I thought would be better replace with Switch statement, you know, in case there appears more cases in the future:

    _storiesTypeController.stream.listen((storiesType) {
           if (storiesType == StoriesType.newStories) {
             _getArticlesAndUpdate(_newIds);
           } else {
             _getArticlesAndUpdate(_topIds);
           }
         });
    

    ... so I tried to implement it but it gave me some error saying that

    Type 'Type' of the switch expression isn't assignable to the type 'Stories Type' of case expressions.

    So I came up with this workaround:

    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');
          }
        }
      });
    

    ... and everything works fine but I wonder if there's another way to switch Enum and why it says the value of local variable storyType isn't used, when I use it in this line:

    _storiesTypeController.stream.listen((storyType)
    

    and I switch over it?