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_bloc
和 bloc_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
更多关于Flutter业务逻辑管理插件bloc_services的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
bloc_services
是一个用于 Flutter 的业务逻辑管理插件,它结合了 flutter_bloc
和 get_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 能够自动更新,你可以使用 ServiceListener
或 ServiceBuilder
来监听服务的变化。
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),
),
);
}
}