Skip to main content

Enums


Basic Enums

enum Direction { north, south, east, west }

enum Color { red, green, blue }

// Usage
var dir = Direction.north;
print(dir); // Direction.north
print(dir.name); // north
print(dir.index); // 0

// In switch
switch (dir) {
case Direction.north: print('Going up');
case Direction.south: print('Going down');
case Direction.east: print('Going right');
case Direction.west: print('Going left');
}

// All values
print(Direction.values); // [Direction.north, Direction.south, ...]

// Parse from string (Dart 2.15+)
var parsed = Direction.values.byName('east'); // Direction.east

Enhanced Enums (Dart 2.17+)

Enums can have fields, constructors, and methods!

enum Planet {
mercury(3.303e+23, 2.4397e6),
venus(4.869e+24, 6.0518e6),
earth(5.976e+24, 6.37814e6),
mars(6.421e+23, 3.3972e6);

// Fields
final double mass; // kg
final double radius; // meters

// Constructor (must be const)
const Planet(this.mass, this.radius);

// Methods
static const double G = 6.67430e-11;
double get surfaceGravity => G * mass / (radius * radius);
double weightOn(double earthWeight) =>
earthWeight * surfaceGravity / Planet.earth.surfaceGravity;
}

print(Planet.earth.surfaceGravity.toStringAsFixed(2)); // 9.80
print(Planet.mars.weightOn(75.0).toStringAsFixed(2)); // 28.46

// Enums can implement interfaces
enum Season implements Comparable<Season> {
spring, summer, autumn, winter;


int compareTo(Season other) => index.compareTo(other.index);

Season get next => Season.values[(index + 1) % 4];
}

print(Season.summer.next); // Season.autumn

Enums as State

Enums are perfect for representing UI state:

enum AppState { loading, success, error, empty }

class ViewModel {
AppState _state = AppState.loading;

AppState get state => _state;

void load() async {
_state = AppState.loading;
try {
await fetchData();
_state = AppState.success;
} catch (e) {
_state = AppState.error;
}
}
}

// In Flutter UI:
Widget build(BuildContext context) {
return switch (viewModel.state) {
AppState.loading => CircularProgressIndicator(),
AppState.success => DataWidget(),
AppState.error => ErrorWidget('Failed to load'),
AppState.empty => EmptyStateWidget(),
};
}