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

1 回复

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


flutter_action_bloc 是一个基于 flutter_bloc 的状态管理插件,它简化了 Bloc 的使用方式,提供了一种更直观的方式来管理应用的状态。flutter_action_bloc 允许你通过 Action 来触发状态变化,而不是直接使用 EventState

以下是 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。你需要定义 ActionState

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

定义 ActionState 类:

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),
          ),
        ],
      ),
    );
  }
}
回到顶部