Flutter结果处理插件result_or的使用
Flutter结果处理插件result_or的使用
result_or
插件是一个基于 ResultOrError
或 Either
概念实现的错误处理库。它适用于 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
更多关于Flutter结果处理插件result_or的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
result_or
是一个用于处理 Flutter 中异步操作结果的插件,它可以帮助你更优雅地处理成功和失败的场景,避免使用大量的 try-catch
块。它类似于 Rust 中的 Result
类型,提供了 Ok
和 Err
两种结果类型。
安装
首先,你需要在 pubspec.yaml
文件中添加 result_or
依赖:
dependencies:
result_or: ^1.0.0
然后运行 flutter pub get
来安装依赖。
基本用法
result_or
提供了 Result<T, E>
类型,其中 T
是成功的类型,E
是错误类型。你可以使用 Result.ok
和 Result.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
支持链式调用,你可以使用 map
、mapErr
、andThen
等方法来处理结果:
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"),
);
}