Flutter结果处理插件result_or的使用

Flutter结果处理插件result_or的使用

result_or 插件是一个基于 ResultOrErrorEither 概念实现的错误处理库。它适用于 Dart 3.0 及以上版本。

特性

使用 ResultOr 可以在 bloc/store 或其他任何地方调用函数时包装在 ResultOr.from() 中。你可以获取结果数据或错误对象,而不是捕获未处理的异常。它支持所有类型的函数:未来函数、简单同步函数、带参数的函数等。

使用方法

简单函数示例

// 简单函数示例
var result = ResultOr.from(someFunction);
// 使用扩展:var result = someFunction.resultOr();

if (result case ResultWithData())  {
  print(result.data); // 输出成功数据
} else if (result case ResultWithError()) {
  print(result.error.message); // 输出错误信息
}

// 回调函数示例
ResultOr.from(someFunction,
    onSuccess: (data) {
        print(data); // 成功时打印数据
    },
    onError: (error) {
      print(error.message); // 错误时打印错误信息
    }
);
// 使用扩展:var result = someFunction.resultOr(onSuccess, onError);

// 示例函数
String someFunction() {
  // 随机值来随机化成功/错误
  var isSuccess = Random().nextBool();

  if (isSuccess) {
    // 如果一切正常,返回数据
    return "success payload";
  } else {
    // 如果有错误,抛出异常
    throw Exception("error");
  }
}

异步函数示例

// 未来函数示例 + switch/case
var result2 = await ResultOr.fromFuture(someFutureFunction);

switch (result2) {
  case ResultWithData():
    print(result2.data); // 输出成功数据
  case ResultWithError():
    print(result2.error.message); // 输出错误信息
}

// 带参数的函数示例
var result3 = ResultOr.from(() => someFunctionWithParam(2));

if (result3 case ResultWithData())  {
  print(result3.data); // 输出成功数据
} else if (result3 case ResultWithError()) {
  print(result3.error.message); // 输出错误信息
}

// 带参数的异步函数示例
var result4 = await ResultOr.fromFuture(() => someFutureFunctionWithParam("Param"));

if (result4 case ResultWithData())  {
  print(result4.data); // 输出成功数据
} else if (result4 case ResultWithError()) {
  print(result4.error.message); // 输出错误信息
}

// 使用扩展和异步函数带参数
var result6 = await (() => someFutureFunctionWithParam("param")).resultOr();

if (result6 case ResultWithData())  {
  print(result6.data); // 输出成功数据
} else if (result6 case ResultWithError()) {
  print(result6.error.message); // 输出错误信息
}

完整示例

以下是一个完整的示例,展示了如何在 Flutter 应用中使用 result_or 插件进行错误处理:

import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:result_or/result_or.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('ResultOr Example')),
        body: Center(child: ResultOrExample()),
      ),
    );
  }
}

class ResultOrExample extends StatefulWidget {
  [@override](/user/override)
  _ResultOrExampleState createState() => _ResultOrExampleState();
}

class _ResultOrExampleState extends State<ResultOrExample> {
  String _resultMessage = '';

  void _callSomeFunction() async {
    var result = ResultOr.from(someFunction);
    // var result = someFunction.resultOr();

    if (result case ResultWithData())  {
      setState(() {
        _resultMessage = 'Result Data: ${result.data}';
      });
    } else if (result case ResultWithError()) {
      setState(() {
        _resultMessage = 'Error Message: ${result.error.message}';
      });
    }
  }

  void _callSomeFutureFunction() async {
    var result2 = await ResultOr.fromFuture(someFutureFunction);

    if (result2 case ResultWithData())  {
      setState(() {
        _resultMessage = 'Future Result Data: ${result2.data}';
      });
    } else if (result2 case ResultWithError()) {
      setState(() {
        _resultMessage = 'Future Error Message: ${result2.error.message}';
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: _callSomeFunction,
          child: Text('Call Some Function'),
        ),
        ElevatedButton(
          onPressed: _callSomeFutureFunction,
          child: Text('Call Some Future Function'),
        ),
        SizedBox(height: 20),
        Text(_resultMessage),
      ],
    );
  }
}

// 示例函数
String someFunction() {
  var isSuccess = Random().nextBool();
  if (isSuccess) {
    return "success payload";
  } else {
    throw Exception("error");
  }
}

// 示例异步函数
Future<String> someFutureFunction() async {
  await Future.delayed(Duration(seconds: 1));
  var isSuccess = Random().nextBool();
  if (isSuccess) {
    return "future success payload";
  } else {
    throw Exception("future error");
  }
}

更多关于Flutter结果处理插件result_or的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter结果处理插件result_or的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


result_or 是一个用于处理 Flutter 中异步操作结果的插件,它可以帮助你更优雅地处理成功和失败的场景,避免使用大量的 try-catch 块。它类似于 Rust 中的 Result 类型,提供了 OkErr 两种结果类型。

安装

首先,你需要在 pubspec.yaml 文件中添加 result_or 依赖:

dependencies:
  result_or: ^1.0.0

然后运行 flutter pub get 来安装依赖。

基本用法

result_or 提供了 Result<T, E> 类型,其中 T 是成功的类型,E 是错误类型。你可以使用 Result.okResult.err 来创建成功或失败的结果。

创建结果

import 'package:result_or/result_or.dart';

Result<int, String> divide(int a, int b) {
  if (b == 0) {
    return Result.err("Division by zero");
  } else {
    return Result.ok(a ~/ b);
  }
}

处理结果

你可以使用 match 方法来处理成功和失败的结果:

void main() {
  final result = divide(10, 0);

  result.match(
    (value) => print("Result: $value"),
    (error) => print("Error: $error"),
  );
}

处理异步操作

result_or 也支持异步操作。你可以使用 Result.async 来处理异步结果:

Future<Result<int, String>> asyncDivide(int a, int b) async {
  await Future.delayed(Duration(seconds: 1));
  if (b == 0) {
    return Result.err("Division by zero");
  } else {
    return Result.ok(a ~/ b);
  }
}

void main() async {
  final result = await asyncDivide(10, 0);

  result.match(
    (value) => print("Result: $value"),
    (error) => print("Error: $error"),
  );
}

链式调用

result_or 支持链式调用,你可以使用 mapmapErrandThen 等方法来处理结果:

void main() {
  final result = divide(10, 2)
      .map((value) => value * 2) // 如果成功,将值乘以 2
      .mapErr((error) => "Mapped Error: $error"); // 如果失败,映射错误信息

  result.match(
    (value) => print("Result: $value"),
    (error) => print("Error: $error"),
  );
}
回到顶部