Flutter行为管理插件behaviour的使用
Flutter行为管理插件behaviour的使用
行为(Behaviours)是在Flutter应用开发中用于处理逻辑操作的一种类。这些行为帮助开发者保持代码的关注点分离,并且使代码更加可测试。
为什么使用行为?
在编写代码时,最好将关注点分离并确保代码可测试。行为有助于实现这一点。它类似于一个全局函数,必须先实例化才能使用。由于它像一个全局函数,因此只有一个关注点:执行一个逻辑操作。因为它仍然是一个类,所以可以在需要的地方注入,或者在测试时进行模拟。
行为本身永远不会抛出异常。所有异常/错误都会被捕获,并以ExceptionOr<TSuccess>
格式返回,该格式要么是一个Failed
,要么是一个Success
。Failed
包含异常,而Success
包含任何返回值。
开始使用行为
带输入的行为
// 行为接收一个输入参数类型TIn,并返回一个TOut。
class CreateCustomer extends Behaviour<CreateCustomerParams, void> {
[@override](/user/override)
Future<void> action(CreateCustomerParams input, BehaviourTrack? track) {
// TODO 逻辑创建客户
return Future.value();
}
}
class CreateCustomerParams {
const CreateCustomerParams({
required this.name,
required this.phoneNumber,
});
final String name;
final String phoneNumber;
}
不带输入的行为
// 这个行为不接收输入参数,并返回一个TOut。
class GetProfileData extends BehaviourWithoutInput<ProfileData> {
[@override](/user/override)
Future<ProfileData> action(BehaviourTrack? track) {
return Future.value(ProfileData(
name: 'Wim',
birthday: DateTime(1993, 10, 07),
));
}
}
class ProfileData {
const ProfileData({
required this.name,
required this.birthday,
});
final String name;
final DateTime birthday;
}
返回值
行为的返回值总是ExceptionOr<TSuccess>
类型。这是一个抽象类,有两个实现者:Failed<TSuccess>
和 Success<TSuccess>
,每个都有一个exception
和 value
属性。为了确定接收到的值是什么,提供了when
方法(以及 thenWhen
用于异步方法)。
Future<void> main() async {
await getProfileData().thenWhen(
(exception) => log('Exception: $exception'),
(value) => log('value: $value'),
);
}
行为监控
为了监控行为正在做什么,有一个BehaviourMonitor
。这是一个工厂类,用于创建一个BehaviourTrack
。在调用行为时,会调用此跟踪的不同方法。
start
当执行动作时调用end
当动作成功完成时调用stopWithException
当发生异常时调用stopWithError
当捕获到其他错误时调用
这个监控器可以用来做日志记录/分析等。
完整示例
import 'dart:async';
import 'dart:developer';
import 'package:behaviour/behaviour.dart';
class CreateCustomer extends Behaviour<CreateCustomerParams, void> {
[@override](/user/override)
Future<void> action(CreateCustomerParams input, BehaviourTrack? track) {
log('TODO 创建客户: ${input.name} - ${input.phoneNumber}');
return Future.value();
}
[@override](/user/override)
FutureOr<Exception> onCatchError(
Object e,
StackTrace stackTrace,
BehaviourTrack? track,
) {
return Exception('未知错误: $e');
}
}
class CreateCustomerParams {
const CreateCustomerParams({
required this.name,
required this.phoneNumber,
});
final String name;
final String phoneNumber;
}
Future<void> main() async {
final createCustomer = CreateCustomer();
await createCustomer(
const CreateCustomerParams(
name: 'Wim',
phoneNumber: '+32 xxx xx xx xx',
),
);
}
更多关于Flutter行为管理插件behaviour的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter行为管理插件behaviour的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,我可以为你提供一个关于如何使用Flutter行为管理插件behaviour
的代码案例。不过,需要注意的是,Flutter社区和官方包中并没有一个广泛认可的标准插件名为behaviour
。为了示范,我将假设你指的是某种自定义行为管理或状态管理的插件,或者类似功能的实现。在Flutter中,状态管理通常使用如Provider
、Riverpod
、Bloc
等库。
不过,为了贴近你的要求,我将创建一个简单的行为管理示例,使用Flutter的InheritedWidget
来实现基本的状态管理,这类似于创建一个自定义的行为管理插件。
1. 创建BehaviourData类
首先,我们创建一个BehaviourData
类来持有和管理状态数据。
import 'package:flutter/material.dart';
class BehaviourData with ChangeNotifier {
String _behaviour;
BehaviourData(this._behaviour);
String get behaviour => _behaviour;
set behaviour(String newValue) {
_behaviour = newValue;
notifyListeners();
}
}
2. 创建BehaviourProvider类
接下来,我们创建一个BehaviourProvider
类,它将作为InheritedWidget
来提供BehaviourData
实例。
class BehaviourProvider extends InheritedWidget {
final BehaviourData data;
BehaviourProvider({required Widget child, required this.data})
: super(child: child);
@override
bool updateShouldNotify(covariant InheritedWidget oldWidget) {
return oldWidget as BehaviourProvider != this;
}
static BehaviourData of(BuildContext context) {
final BehaviourProvider provider =
context.dependOnInheritedWidgetOfExactType<BehaviourProvider>()!;
return provider.data;
}
}
3. 使用BehaviourProvider在应用程序中
现在,我们可以在应用程序中使用BehaviourProvider
来提供和管理行为数据。
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: BehaviourProvider(
data: BehaviourData('Initial Behaviour'),
child: BehaviourScreen(),
),
);
}
}
class BehaviourScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final BehaviourData behaviourData = BehaviourProvider.of(context);
return Scaffold(
appBar: AppBar(
title: Text('Behaviour Management Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Current Behaviour: ${behaviourData.behaviour}',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
behaviourData.behaviour = 'New Behaviour';
},
child: Text('Change Behaviour'),
),
],
),
),
);
}
}
解释
- BehaviourData类:这是一个持有行为数据并通知监听者的类。它使用了
ChangeNotifier
来管理监听者。 - BehaviourProvider类:这是一个
InheritedWidget
,它提供了BehaviourData
实例。这使得任何子组件都可以访问和监听行为数据的变化。 - MyApp和BehaviourScreen类:这些类展示了如何在应用程序中使用
BehaviourProvider
来提供和管理行为数据。BehaviourScreen
组件显示了当前的行为,并提供了一个按钮来更改行为。
这个示例展示了如何使用Flutter的基本工具来实现一个简单的行为管理插件。当然,对于更复杂的需求,你可能会考虑使用更高级的状态管理库,如Provider
、Riverpod
或Bloc
。