Dart Enums
Posted on April 14, 2020 in Dart

Introduction
Enumerated Types (a.k.a Enums) were added as an experimental feature in Dart 1.8 release. Enums are like a class that represents a fixed number of constant values.
Imagine that you're working on a weather application, and you need a way to represent different states for weather. For example, weather can be sunny, cloudy or rainy. Now, you have two ways to represent these states in your code.
Using Constants
You can represent each state using a const keyword.
const SUNNY = 'Sunny';
const CLOUDY = 'Cloudy';
const RAINY = 'Rainy';
Using Enumerated Types
Another way to represent the same information is to use enumerated types using the enum keyword.
enum Weather {
sunny,
cloudy,
rainy,
}
Use UpperCamelCase for enums like
Weather.Use lowerCamelCase for enum values. For example:
sunny,cloudy, andrainy.
In the following section, let's explore the cases where using Enums make more sense.
Switch
In switch block, constants behave differently than enums.
Using Constants
When different type of weather state is represented using const, it's okay with
switch block to declare case block for one constant. default block is optional as well.
There's no compilation error when only one case block for sunny is declared, without default block.
//Using constants to display weather information
void mainSwitchConstants() {
const SUNNY = 'Sunny';
const CLOUDY = 'Cloudy';
const RAINY = 'Rainy';
//#1. Switch doesn't complain for const, but raise error for enums
var choice = SUNNY;
switch (choice) {
case SUNNY:
print("Sunny weather today");
break;
}
}
Output:
Sunny weather today
Using Enums
The switch block for enums requires case blocks for all of the enum class Weather members. The default block is required when case blocks for all enumerated type members are not available. Otherwise, you would see the compilation error like below:

Here's switch block with case blocks for all enum members:
//Using Enums to display weather information
void mainSwitchEnums() {
var weather = Weather.sunny;
//Following code will complain about
// not including other types of weather
//OR use default
switch (weather) {
case Weather.sunny:
print("Sunny weather today!");
break;
case Weather.cloudy:
print("Cloudy today!");
break;
case Weather.rainy:
print("Rainy and gloomy weather.");
break;
}
}
Output:
Sunny weather today!
Check out the switch block when there's only default block is available. It prints the value of the current enum weather.
//Only default case. No compilation issue
void mainSwitchEnumsDefault() {
var weather = Weather.sunny;
switch (weather) {
default:
print("Current weather:${weather}");
}
}
Output:
Current weather:Weather.sunny
Iterating
The another reason to use enums over constants could be to iterate over all the different types of weather. For constants, you would need a list to store all values, and then iterate over that list.
However, for enums, all the members of enums can be listed using Weather.values. Let's print all the members of Weather enumerated type.
void mainIterating() {
//#2. enums can iterate on all types at once.
//No need to create a list of const
Weather.values.forEach((w) => print(w));
}
Output:
Weather.sunny
Weather.cloudy
Weather.rainy
Enums extension
Enumerated types are supported by extensions. Check out my previous article on Dart Extensions here. Let's add an extension method console() to print index of enum and a custom message about along with it.
extension WeatherExt on Weather {
//custom message for each weather type
static const weatherMap = {
Weather.sunny: "What a lovely weather",
Weather.cloudy: "Scattered showers predicted",
Weather.rainy: "Will be raining today",
};
//prints enum index and custom message
void console() {
print("${this.index} ${this.about}");
}
//about property returns the custom message
String get about => weatherMap[this];
}
Next, iterate over all the members, and use extension method console() to print the custom message for each weather type.
void mainExtension() {
//#3. Enum extensions. Using extension method console
Weather.values.forEach((w) => w.console());
}
Output:
0 What a lovely weather
1 Scattered showers predicted
2 Will be raining today
Summary
In this article, we saw how enums can be a better choice over constants. We also learned to iterate over enums and using extensions for enumerated types.
That's it for this article. Check out the Dart Vocabulary Series for other Dart stuff.
Check out Video
Source Code
Please checkout the source code at Github here
References
Happy Darting :)
_Liked the article ? Couldn't find a topic of your interest ? Please leave a comment or reach out at twitter about the topics you would like me to share !
BTW I love cupcakes and coffee both :)_
Follow me at Medium