I needed a simple Result like Swift's Result.
I have seen people using dartz with the Either type. But for me, thats not really clear and readable.
Other solutions like result and super_enum did not fit my needs neither. So here is my solution.
This packages uses the freezed package and adds some helper methods. Thank you for this great package!
Add the following to you pubspec.yaml
and replace [version]
with the latest version:
dependencies:
simple_result: ^[version]
import with
import 'package:simple_result/simple_result.dart';
To create a Result use
Result<ValueType, FailureType>.success(value)
or
Result<ValueType, FailureType>.failure(failure)
You can then 'iterate' over success or failure with:
result.when(
success(value) {
//doSomeThing with success value
},
failure(failure) {
//doSomeThing with failure
}
);
You can map the Result value type with map:
Result<User, Failure>.success(user);
final stringResult = result.mapSuccesss((user) => user.username);
// stringResult is of Type Result<String, Failure>
You can use convenience methods on a Result
final userResult = Result<User, Failure>.success(user);
userResult.isSuccess; // -> true
userResult.success; // -> user object.
import 'package:simple_result/simple_result.dart';
final mySuccessResult = Result<String,Failure>.success('success value');
final myErrorResult = Result<String,Failure>.failure(MyFailure());
mySuccessResult.isSuccess // -> true
mySuccessResult.success; // -> 'success value'
final myStringResult = mySuccessResult
.when(
success:(value) => value.toString(),
failure:(_) => 'ERROR');
mySuccessResult.map((value) => 'StringResult'); // maps to Result<String, Failure>()
see more in example/main.dart