Flutter状态管理插件flutter_action_bloc的使用
Flutter状态管理插件flutter_action_bloc的使用
flutter_action_bloc
是一个用于简化在 Flutter 中使用 action_bloc
的插件。它构建来与以下包一起工作:
action_bloc
- 一个扩展了 bloc 以支持副作用的包。action_bloc_test
-action_bloc
的测试包。flutter_action_bloc_hooks
- 扩展了flutter_action_bloc
以支持flutter_hooks
的包。flutter_bloc_hooks
- 扩展了bloc
以支持flutter_hooks
的包。
安装
在你的 pubspec.yaml
文件中添加依赖项:
flutter pub add flutter_action_bloc
示例
你可以查看 示例 来了解如何使用该插件。
示例代码
import 'package:action_bloc/action_bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_action_bloc/flutter_action_bloc.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
void main() => runApp(const CounterApp());
// 一个计算并发出 FizzBuzz 动作的 Cubit
class CounterCubit extends ActionCubit<int, String> {
CounterCubit() : super(0);
void increment() {
emit(state + 1); // 增加当前状态值
if (state % 15 == 0) {
emitAction('FizzBuzz'); // 如果状态能被15整除,则发出 FizzBuzz 动作
} else if (state % 5 == 0) {
emitAction('Buzz'); // 如果状态能被5整除,则发出 Buzz 动作
} else if (state % 3 == 0) {
emitAction('Fizz'); // 如果状态能被3整除,则发出 Fizz 动作
}
}
}
class CounterApp extends StatelessWidget {
const CounterApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return BlocProvider<CounterCubit>(
create: (context) => CounterCubit(), // 创建 CounterCubit 实例
child: const MaterialApp(
home: CounterPage(),
),
);
}
}
class CounterPage extends StatelessWidget {
const CounterPage({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () => context.read<CounterCubit>().increment(), // 增加计数
child: const Icon(Icons.add), // 设置图标为加号
),
body: ActionBlocListener<CounterCubit, String>( // 监听 CounterCubit 发出的动作
listener: (context, action) {
final snackBar = SnackBar(
content: Text('$action'), // 显示动作内容
duration: Duration(seconds: 2), // 持续时间
behavior: SnackBarBehavior.floating, // 设置悬浮行为
);
ScaffoldMessenger.of(context)
..clearSnackBars() // 清除所有 SnackBar
..showSnackBar(snackBar); // 显示 SnackBar
},
child: BlocBuilder<CounterCubit, int>( // 构建计数器界面
builder: (context, state) {
return Center(
child: Text(
'$state', // 显示当前计数值
style: Theme.of(context).textTheme.headline4, // 设置文本样式
),
);
},
),
),
);
}
}
更多关于Flutter状态管理插件flutter_action_bloc的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter状态管理插件flutter_action_bloc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_action_bloc
是一个基于 flutter_bloc
的状态管理插件,它简化了 Bloc
的使用方式,提供了一种更直观的方式来管理应用的状态。flutter_action_bloc
允许你通过 Action
来触发状态变化,而不是直接使用 Event
和 State
。
以下是 flutter_action_bloc
的基本使用步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 flutter_action_bloc
依赖:
dependencies:
flutter:
sdk: flutter
flutter_action_bloc: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
2. 创建 Bloc
创建一个 Bloc
类,继承自 ActionBloc
。你需要定义 Action
和 State
。
import 'package:flutter_action_bloc/flutter_action_bloc.dart';
class CounterBloc extends ActionBloc<CounterAction, CounterState> {
CounterBloc() : super(CounterState(0));
[@override](/user/override)
Stream<CounterState> mapActionToState(CounterAction action) async* {
if (action is IncrementAction) {
yield CounterState(state.count + 1);
} else if (action is DecrementAction) {
yield CounterState(state.count - 1);
}
}
}
3. 定义 Action 和 State
定义 Action
和 State
类:
abstract class CounterAction extends Action {}
class IncrementAction extends CounterAction {}
class DecrementAction extends CounterAction {}
class CounterState {
final int count;
CounterState(this.count);
}
4. 使用 Bloc 在 UI 中
在 UI
中使用 Bloc
,你可以通过 BlocProvider
来提供 Bloc
,并通过 BlocBuilder
来监听状态变化。
import 'package:flutter/material.dart';
import 'package:flutter_action_bloc/flutter_action_bloc.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: BlocProvider(
create: (context) => CounterBloc(),
child: CounterScreen(),
),
);
}
}
class CounterScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
final counterBloc = context.bloc<CounterBloc>();
return Scaffold(
appBar: AppBar(title: Text('Counter App')),
body: Center(
child: BlocBuilder<CounterBloc, CounterState>(
builder: (context, state) {
return Text(
'Count: ${state.count}',
style: TextStyle(fontSize: 24),
);
},
),
),
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
FloatingActionButton(
onPressed: () => counterBloc.add(IncrementAction()),
child: Icon(Icons.add),
),
SizedBox(height: 10),
FloatingActionButton(
onPressed: () => counterBloc.add(DecrementAction()),
child: Icon(Icons.remove),
),
],
),
);
}
}