Flutter状态管理监控插件flutter_bloc_monitor的使用

Flutter状态管理监控插件flutter_bloc_monitor的使用

一个用于监控所有BloC活动的包。你可以监控添加的事件顺序,查看发生的所有转换和抛出的错误。

基本用法

该包使用起来非常简单。只需创建一个FlutterBlocMonitorDelegate并将其传递给BlocSupervisor

void main() {
  BlocSupervisor.delegate = FlutterBlocMonitorDelegate();
  runApp(MyApp());
}

通过这样做,你的所有BloC将开始被跟踪。

此包通过静态变量公开所有操作、转换和错误,因此你可以在任何地方使用它们。

FlutterBlocMonitorDelegate.events
FlutterBlocMonitorDelegate.transitions
FlutterBlocMonitorDelegate.errors

如果你想以更友好的方式查看此类信息,可以导航到一个显示这些信息的页面。为此只需执行以下代码:

Navigator.of(context).push(
      MaterialPageRoute(
        builder: (_) => FlutterBlocMonitorPage(),
      ),
    );

高级用法

如果你希望在事件、转换和错误发生时进行自己的处理,可以通过onEventFunconTransitionFunconErrorFunc参数传递回调函数。

void main() {
  BlocSupervisor.delegate = FlutterBlocMonitorDelegate(
    onEventFunc: (bloc, event) => print(event),
    onTransitionFunc: (bloc, transition) => print(transition),
    onErrorFunc: (bloc, error, stacktrace) => print(error),
  );
  runApp(MyApp());
}

待办事项

  • ❌ 测试

特性与问题

请在问题追踪器上建议新功能和报告问题。


示例代码

以下是完整的示例代码,展示了如何使用flutter_bloc_monitor插件。

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

import 'bloc/blocs.dart';
import 'bloc/red/red_bloc.dart';

void main() {
  // 设置Bloc观察者为FlutterBlocMonitorDelegate,并提供回调函数
  Bloc.observer = FlutterBlocMonitorDelegate(
    onEventFunc: (bloc, event) => print(event),
    onTransitionFunc: (bloc, transition) => print(transition),
    onErrorFunc: (bloc, error, stacktrace) => print(error),
  );
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: MultiBlocProvider(
          providers: [
            // 提供多个Bloc实例
            BlocProvider<RedBloc>(
              create: (_) => RedBloc(),
            ),
            BlocProvider<BlueBloc>(
              create: (_) => BlueBloc(),
            ),
            BlocProvider<GreenBloc>(
              create: (_) => GreenBloc(),
            ),
          ],
          child: SampleWidget(),
        ),
      ),
    );
  }
}

class SampleWidget extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Column(
          children: [
            // 使用BlocBuilder构建带有Bloc状态的UI组件
            BlocBuilder<RedBloc, RedState>(
              builder: (_, state) => Container(
                height: 100,
                child: Center(
                  child: ElevatedButton(
                    style: ButtonStyle(
                      backgroundColor: MaterialStateProperty.all<Color>(
                        Colors.red,
                      ),
                    ),
                    child: Text(
                      'Add RedBloc Event',
                      style: TextStyle(
                        color: Colors.white,
                      ),
                    ),
                    onPressed: () => context.read<RedBloc>().add(RedEvent1()),
                  ),
                ),
              ),
            ),
            BlocBuilder<BlueBloc, BlueState>(
              builder: (_, state) => Container(
                height: 100,
                child: Center(
                  child: ElevatedButton(
                    style: ButtonStyle(
                      backgroundColor: MaterialStateProperty.all<Color>(
                        Colors.blue,
                      ),
                    ),
                    child: Text(
                      'Add BlueBloc Event',
                      style: TextStyle(
                        color: Colors.white,
                      ),
                    ),
                    onPressed: () => context.read<BlueBloc>().add(BlueEvent1()),
                  ),
                ),
              ),
            ),
            BlocBuilder<GreenBloc, GreenState>(
              builder: (_, state) => Container(
                height: 100,
                child: Center(
                  child: ElevatedButton(
                    style: ButtonStyle(
                      backgroundColor: MaterialStateProperty.all<Color>(
                        Colors.green,
                      ),
                    ),
                    child: Text(
                      'Add GreenBloc Event',
                      style: TextStyle(
                        color: Colors.white,
                      ),
                    ),
                    onPressed: () => context.read<GreenBloc>().add(GreenEvent1()),
                  ),
                ),
              ),
            ),
            SizedBox(height: 30),
            // 导航到Bloc监控页面
            Container(
              height: 100,
              child: ElevatedButton(
                style: ButtonStyle(
                  backgroundColor: MaterialStateProperty.all<Color>(
                    Theme.of(context).primaryColor,
                  ),
                ),
                child: Text('See Bloc Monitor Page'),
                onPressed: () => Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (_) => FlutterBlocMonitorPage(),
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


flutter_bloc_monitor 是一个用于监控和调试 Flutter Bloc 状态管理库的插件。它可以帮助开发者实时查看 Bloc 的状态变化、事件流以及相关的调试信息。这个工具在开发和调试复杂的状态管理逻辑时非常有用,尤其是在使用 flutter_bloc 库时。

以下是使用 flutter_bloc_monitor 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_bloc: ^8.0.0
  flutter_bloc_monitor: ^latest_version

运行 flutter pub get 来安装依赖。

2. 在应用中集成 BlocMonitor

在你的应用的 main.dart 文件中,使用 BlocMonitor 来包裹你的应用或特定的 Bloc 树。

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

void main() {
  runApp(
    BlocMonitor(
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Bloc Monitor Example',
      home: BlocProvider(
        create: (context) => MyBloc(),
        child: MyHomePage(),
      ),
    );
  }
}

3. 使用 BlocMonitor 监控 Bloc 状态

在应用中,你可以通过 BlocMonitor 提供的界面实时查看 Bloc 的状态变化、事件流等信息。通常,这会通过一个浮动按钮或开发工具来触发。

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Bloc Monitor Example'),
      ),
      body: Center(
        child: BlocBuilder<MyBloc, MyState>(
          builder: (context, state) {
            return Text('State: $state');
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          context.read<MyBloc>().add(MyEvent());
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

4. 运行应用并监控状态

运行你的应用,然后在应用中触发事件或状态变化。你可以在 BlocMonitor 的界面中实时查看这些变化。

5. 高级配置(可选)

BlocMonitor 还提供了一些高级配置选项,比如自定义监控器的外观、设置过滤器等。你可以根据需要进行配置。

BlocMonitor(
  theme: BlocMonitorThemeData(
    backgroundColor: Colors.black,
    textColor: Colors.white,
  ),
  child: MyApp(),
);
回到顶部