Flutter行为管理插件behaviour的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter行为管理插件behaviour的使用

行为(Behaviours)是在Flutter应用开发中用于处理逻辑操作的一种类。这些行为帮助开发者保持代码的关注点分离,并且使代码更加可测试。

为什么使用行为?

在编写代码时,最好将关注点分离并确保代码可测试。行为有助于实现这一点。它类似于一个全局函数,必须先实例化才能使用。由于它像一个全局函数,因此只有一个关注点:执行一个逻辑操作。因为它仍然是一个类,所以可以在需要的地方注入,或者在测试时进行模拟。

行为本身永远不会抛出异常。所有异常/错误都会被捕获,并以ExceptionOr<TSuccess>格式返回,该格式要么是一个Failed,要么是一个SuccessFailed包含异常,而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>,每个都有一个exceptionvalue 属性。为了确定接收到的值是什么,提供了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

1 回复

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


当然,我可以为你提供一个关于如何使用Flutter行为管理插件behaviour的代码案例。不过,需要注意的是,Flutter社区和官方包中并没有一个广泛认可的标准插件名为behaviour。为了示范,我将假设你指的是某种自定义行为管理或状态管理的插件,或者类似功能的实现。在Flutter中,状态管理通常使用如ProviderRiverpodBloc等库。

不过,为了贴近你的要求,我将创建一个简单的行为管理示例,使用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'),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. BehaviourData类:这是一个持有行为数据并通知监听者的类。它使用了ChangeNotifier来管理监听者。
  2. BehaviourProvider类:这是一个InheritedWidget,它提供了BehaviourData实例。这使得任何子组件都可以访问和监听行为数据的变化。
  3. MyApp和BehaviourScreen类:这些类展示了如何在应用程序中使用BehaviourProvider来提供和管理行为数据。BehaviourScreen组件显示了当前的行为,并提供了一个按钮来更改行为。

这个示例展示了如何使用Flutter的基本工具来实现一个简单的行为管理插件。当然,对于更复杂的需求,你可能会考虑使用更高级的状态管理库,如ProviderRiverpodBloc

回到顶部