inline_result 1.0.0 copy "inline_result: ^1.0.0" to clipboard
inline_result: ^1.0.0 copied to clipboard

This package brings a Kotlin-like Result<T> to Dart, using extension types for zero-cost wrapping.

Inline Result πŸš€ #

Welcome to Inline Result – your new best friend for functional error handling in Flutter/Dart. If you're coming from Android and miss Kotlin's slick Result type, this package is here to save you from messy try/catch blocks and help you write safer, cleaner code.

This package brings a Kotlin-like Result<T> to Dart, using extension types for zero-cost wrapping.

✨ Features #

βœ… Functional Error Handling – Chain transformations without losing control. βœ… Zero-Cost Wrapping – Uses Dart extension types, meaning no extra objects at runtime. βœ… Familiar API – Inspired by Kotlin's Result<T>, but Dart-friendly. βœ… Safe & Readable – No more null checks or exceptions hiding in logs.

Why Inline Result? #

Flutter/Dart lacks a built-in, functional way to handle errors like Kotlin. With Dart Result, you get a familiar and robust API to:

  • Avoid nested try/catch blocks
  • Chain operations declaratively
  • Embrace immutability and safer coding practices

⚑ Quick Comparison: Kotlin vs Dart #

fun divide(a: Int, b: Int): Result<Int> {
    return runCatching { a / b }
}

val result = divide(10, 2)
    .map { it * 2 }
    .getOrElse { -1 }

println(result) // 10
Result<int> divide(int a, int b) {
  return Result.runCatching(() => a ~/ b);
}

final result = divide(10, 2)
    .map((value) => value * 2)
    .getOrElse((_) => -1);

print(result); // 10

πŸ—οΈ What’s Inlining & Why Should You Care? #

Kotlin's Result<T> is an inline class, meaning it avoids extra allocations while wrapping values. Dart doesn’t have inline classes, but extension types do something similar:

extension type Result<T>._(dynamic _value) { ... }

With this, your Result<T> doesn’t create an extra objectβ€”it’s just a wrapper at compile-time. This means no runtime overhead and native performance. πŸš€

πŸ› οΈ Usage Examples #

βœ… Basic Success & Failure #

final success = Result.success("Yay!");
final failure = Result.failure(Exception("Oops!"));

print(success.getOrNull); // "Yay!"
print(failure.getOrNull); // null

πŸ”— Chaining with map and recover #

final result = Result.runCatching(() => int.parse("42"))
    .map((value) => value * 2)
    .recover((_) => 0);

print(result.getOrThrow); // 84

πŸ”₯ Handling Failures Gracefully #

final result = Result.runCatching(() => int.parse("NaN"))
    .getOrElse((e) => -1);

print(result); // -1

⁉️ Why does Result only catch Exceptions? #

The problem is that dart error system not perfect, Error and Exception does not have single parent. And since Error is a class that should not be caught, we decided to keep only Exception.

Feel free to implement runErrorCatching or runObjectCatching in your project and use it. πŸ”₯

❀️ Contributing #

If you have ideas, improvements, or just want to say Result.success("hello!"), feel free to open an issue or PR!

4
likes
0
points
32
downloads

Publisher

unverified uploader

Weekly Downloads

This package brings a Kotlin-like Result<T> to Dart, using extension types for zero-cost wrapping.

Repository (GitHub)
View/report issues

Topics

#result #inline #either #errors

License

unknown (license)

Dependencies

meta

More

Packages that depend on inline_result