Flutter业务逻辑管理插件bloc_services的使用

Flutter业务逻辑管理插件bloc_services的使用

bloc_services 是一个基于 Clean Architecture 的流实现包,用于与 bloc 结合使用。它提供了完整的测试支持。

特性

  • 专为 Clean Architecture 设计。
  • 提供 Stream 混入类,可以与 blocs/cubits 集成。
  • 使用 Either(来自 dartz 包)来获取正确的流数据。

开始使用

pubspec.yaml 文件中添加依赖项:

dependencies:
  bloc_services: <latest-version>
  flutter_bloc: <latest-version>

使用方法

要有效地使用 bloc_services,你可以参考 example 目录中的完整示例。以下是一个基本示例:

示例代码

首先,确保你已经安装了 flutter_blocbloc_services 依赖项。

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:bloc_services/bloc_services.dart';

// 定义事件
class ExampleEvent {}

// 定义状态
class ExampleState {}

// 定义一个使用了 MultipleStreamMixin 的 Bloc
class ExampleBloc
    extends Bloc<ExampleEvent, ExampleState>
    with
        MultipleStreamMixin {
  // 构造函数
  ExampleBloc() : super(ExampleState());

  // 处理事件的方法
  [@override](/user/override)
  Stream<ExampleState> mapEventToState(
    ExampleEvent event,
  ) async* {}

  // 获取流的 Map
  [@override](/user/override)
  Map<Object, StreamData<Object, Object>> get streams => {};

}

流的详细说明

MultipleStreamMixin 提供了一个 streams 方法覆盖,该方法返回一个 Map<Object, StreamData<Object, Object>>。其中包含一个唯一的键(任何对象)和 StreamData

  • stream:具有 Either<L,R> 类型的返回值,其中 L 被视为错误,R 被视为有效数据。
  • StreamData 有两个类型参数 <L,R>,这些类型将被用作 stream 字段的返回类型。
  • 每当流发出 R 时,会调用一个名为 onStreamData 的函数,该函数有两个参数:一个是 streams map 中给定的键,另一个是 R 数据。
  • 每当 L 被调用时,会调用 onStreamError 函数。

主应用代码

import 'package:example/features/stream_bloc_example/page/stream_bloc_page.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const StreamBlocPage(),
    );
  }
}

更多关于Flutter业务逻辑管理插件bloc_services的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


bloc_services 是一个用于 Flutter 的业务逻辑管理插件,它结合了 flutter_blocget_it 来实现依赖注入和状态管理。通过 bloc_services,你可以更容易地管理和组织你的业务逻辑,并且能够更好地分离 UI 和业务逻辑。

安装

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

dependencies:
  flutter:
    sdk: flutter
  bloc_services: ^1.0.0  # 请使用最新版本

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

基本用法

1. 定义服务

首先,你需要定义一个服务类,这个类将包含你的业务逻辑。你可以使用 ServiceBase 作为基类。

import 'package:bloc_services/bloc_services.dart';

class CounterService extends ServiceBase {
  int _count = 0;

  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }
}

2. 注册服务

接下来,你需要在应用程序启动时注册这个服务。通常你可以在 main.dart 中完成这个操作。

import 'package:bloc_services/bloc_services.dart';
import 'package:flutter/material.dart';
import 'counter_service.dart';

void main() {
  // 注册服务
  Services.instance.registerSingleton<CounterService>(CounterService());

  runApp(MyApp());
}

3. 使用服务

在 UI 中,你可以通过 Services.instance.get<CounterService>() 来获取服务实例,并在需要时调用服务中的方法。

import 'package:flutter/material.dart';
import 'package:bloc_services/bloc_services.dart';
import 'counter_service.dart';

class CounterPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final counterService = Services.instance.get<CounterService>();

    return Scaffold(
      appBar: AppBar(
        title: Text('Counter App'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Count:',
            ),
            Text(
              '${counterService.count}',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counterService.increment();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

4. 监听服务变化

如果你希望 UI 能够自动更新,你可以使用 ServiceListenerServiceBuilder 来监听服务的变化。

import 'package:flutter/material.dart';
import 'package:bloc_services/bloc_services.dart';
import 'counter_service.dart';

class CounterPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Counter App'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Count:',
            ),
            ServiceBuilder<CounterService>(
              builder: (context, counterService) {
                return Text(
                  '${counterService.count}',
                  style: Theme.of(context).textTheme.headline4,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          final counterService = Services.instance.get<CounterService>();
          counterService.increment();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
回到顶部