super_enum 0.0.1 super_enum: ^0.0.1 copied to clipboard
Create super-powered enums similar to sealed classes in Kotlin.
Super-powered enums similar to sealed classes in Kotlin
Installation #
Add the following to you pubspec.yaml
and replace [version]
with the latest version:
dependencies:
super_enum: ^[version]
dev_dependencies:
super_enum_generator: ^[version]
build_runner: ^1.7.1 // Any latest version which works with your current Dart or Flutter SDK
Example #
A Super Enum can be easily generated by annotating a private enum with @superEnum
import 'package:super_enum/super_enum.dart';
part "result.g.dart";
@superEnum
enum _Result {
@generic
@Data(fields: [
DataField('data', Generic),
DataField('message', String),
])
Success,
@object
Error,
}
@Data()
marks an enum value to be treated as a Data class.
- One should supply a list of possible fields inside the annotation.
- If you don't want to add fields, use
@object
annotation instead. - Fields are supplied in the form of
DataField
objects. - Each
DataField
must contain thename
and thetype
of the field. - If the field type needs to be generic use
Generic
type and annotate the enum value with@generic
annotation.
@object
marks an enum value to be treated as an object.
Run the build_runner
command to generate the filename.g.dart
part file.
# Dart SDK: $pub run build_runner build
# Flutter SDK: $flutter pub run build_runner build
Generated file #
@immutable
abstract class Result<T> {
const Result(this._type);
factory Result.success({@required T data, @required String message}) =
Success<T>;
factory Result.error() = Error<T>;
final _Result _type;
R when<R>(
{@required R Function(Success) onSuccess,
@required R Function(Error) onError}) {
switch (this._type) {
case _Result.Success:
return onSuccess(this as Success);
case _Result.Error:
return onError(this as Error);
}
}
}
@immutable
class Success<T> extends Result<T> {
const Success({@required this.data, @required this.message})
: super(_Result.Success);
final T data;
final String message;
}
@immutable
class Error<T> extends Result<T> {
const Error() : super(_Result.Error);
}
Usage #
Below is just one of the use-case of Super Enums
. It can be used wherever you want to manage state.
// Creating an StreamController of type Result<int>
final _resultController = StreamController<Result<int>>();
// Adding a success state to the stream controller
_resultController.add(Result.success(
data: 333,
message: 'Success',
)),
// Adding an error state to the stream controller
_resultController.add(Result.error()),
// Listening to all the possible Result states
_resultController.stream.listen((result) {
result.when(
onSuccess: (data) => print(data.message), // Success
onError: (_) => print('Error Occured'), // Error Occured
);
});
Getting Started #
This project is a starting point for a Dart package, a library module containing code that can be shared easily across multiple Flutter or Dart projects.
For help getting started with Flutter, view our online documentation, which offers tutorials, samples, guidance on mobile development, and a full API reference.