Flutter日志管理插件talker_bloc_logger的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter日志管理插件talker_bloc_logger的使用

talker_bloc_logger

talker_bloc_logger 是一个轻量级且可定制化的基于 BLoC 状态管理库的日志记录器,它建立在 talker 的基础上。Talker 为Dart/Flutter应用程序提供了先进的异常处理和日志记录功能。

GitHub codecov Pub License: MIT

Preview

这是您BLoC事件调用和状态发出的日志在控制台中的显示方式:

为了更好地了解它是如何工作的,请查看 Web Demo 页面。

Getting Started

Add Dependency

首先,在您的 pubspec.yaml 文件中添加依赖:

dependencies:
  talker_bloc_logger: ^4.6.4

Usage

只需设置 TalkerBlocObserver 作为 Bloc.observer 字段,它就可以工作了。

import 'package:talker_bloc_logger/talker_bloc_logger.dart';

void main() {
  Bloc.observer = TalkerBlocObserver();
  // 启动应用
}

Using with Talker

如果您已经在项目中使用了 Talker,可以将 Talker 实例传递给 TalkerBlocObserver,这样所有的日志和错误都会进入您的统一跟踪系统。

import 'package:talker_bloc_logger/talker_bloc_logger.dart';
import 'package:talker/talker.dart';

final talker = Talker();
Bloc.observer = TalkerBlocObserver(talker: talker);

Settings

此包具有许多自定义选项,您可以启用或禁用某些事件、BLoC创建、变化、关闭日志等…

Bloc.observer = TalkerBlocObserver(
  settings: TalkerBlocLoggerSettings(
    enabled: true,
    printEventFullData: false,
    printStateFullData: false,
    printChanges: true,
    printClosings: true,
    printCreations: true,
    printEvents: true,
    printTransitions: true,
    // 如果只想记录 AuthBloc 的转换
    transitionFilter: (bloc, transition) =>
        bloc.runtimeType.toString() == 'AuthBloc',
    // 如果只想记录 AuthBloc 的事件
    eventFilter: (bloc, event) => bloc.runtimeType.toString() == 'AuthBloc',
  ),
);

示例代码

下面是一个完整的示例,展示了如何使用 talker_bloc_logger 记录 BLoC 的事件和状态变化。

import 'package:bloc/bloc.dart';
import 'package:talker_bloc_logger/talker_bloc_logger.dart';

void main() async {
  Bloc.observer = TalkerBlocObserver(
    settings: TalkerBlocLoggerSettings(
      enabled: true,
      printEventFullData: false,
      printStateFullData: false,
      printChanges: true,
      printClosings: true,
      printCreations: true,
      printEvents: true,
      printTransitions: true,
      // 如果只想记录 AuthBloc 的转换
      transitionFilter: (bloc, transition) =>
          bloc.runtimeType.toString() == 'AuthBloc',
      // 如果只想记录 AuthBloc 的事件
      eventFilter: (bloc, event) => bloc.runtimeType.toString() == 'AuthBloc',
    ),
  );
  final somethingBloc = SomethingBloc();
  somethingBloc.add(LoadSomething(LoadSomethingCase.successful));
  await Future.delayed(const Duration(milliseconds: 300));
  somethingBloc.add(LoadSomething(LoadSomethingCase.failure));
}

enum LoadSomethingCase { successful, failure }

class SomethingBloc extends Bloc<SomethingEvent, SomethingState> {
  SomethingBloc() : super(SomethingInitial()) {
    on<LoadSomething>((event, emit) {
      emit(SomethingLoading());
      if (event.loadCase == LoadSomethingCase.successful) {
        emit(SomethingLoaded());
        return;
      }
      throw Exception('Load something failure');
    });
  }
}

abstract class SomethingEvent {}

class LoadSomething extends SomethingEvent {
  LoadSomething(this.loadCase);

  final LoadSomethingCase loadCase;
}

abstract class SomethingState {}

class SomethingInitial extends SomethingState {}

class SomethingLoading extends SomethingState {}

class SomethingLoaded extends SomethingState {}

class SomethingLoadingFailure extends SomethingState {
  SomethingLoadingFailure(this.exception);
  final Object? exception;
}

通过以上步骤,您可以轻松地在您的 Flutter 应用程序中集成 talker_bloc_logger,并根据需要自定义日志记录的行为。希望这些信息对您有所帮助!如果有任何问题或建议,请随时提出。


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

1 回复

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


当然,下面是一个关于如何使用Flutter日志管理插件talker_bloc_logger的示例代码。这个插件通常用于在Flutter应用中管理Bloc架构中的日志记录。假设你已经有一个Flutter项目并且已经添加了talker_bloc_logger依赖。

1. 添加依赖

首先,确保在你的pubspec.yaml文件中添加talker_bloc_logger依赖:

dependencies:
  flutter:
    sdk: flutter
  # 其他依赖...
  talker_bloc_logger: ^最新版本号  # 请替换为实际最新版本号

2. 导入插件

在你需要使用日志管理的地方导入插件:

import 'package:talker_bloc_logger/talker_bloc_logger.dart';

3. 配置BlocObserver

在你的应用入口文件(通常是main.dart)中,配置BlocObserver来使用TalkerBlocLogger

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

// 假设你有一个 MyApp 组件
void main() {
  Bloc.observer = BlocObserver(
    onError: (Bloc<Object, Object> bloc, Object error, StackTrace stackTrace) {
      // 这里可以添加自定义的错误处理逻辑
      print('Bloc Error: $error');
    },
    onTransition: (Bloc<Object, Object> bloc, Transition<Object, Object> transition) {
      // 使用 TalkerBlocLogger 记录转换日志
      TalkerBlocLogger.logTransition(transition);
    },
    onEvent: (Bloc<Object, Object> bloc, Object event) {
      // 使用 TalkerBlocLogger 记录事件日志
      TalkerBlocLogger.logEvent(event);
    },
    onChange: (Bloc<Object, Object> bloc, Change<Object> change) {
      // 使用 TalkerBlocLogger 记录状态变化日志
      TalkerBlocLogger.logChange(change);
    },
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter TalkerBlocLogger Demo')),
        body: MyHomePage(),
      ),
    );
  }
}

4. 使用Bloc

接下来,在你的Bloc和Cubit中正常使用Bloc模式,TalkerBlocLogger会自动记录相关日志。例如,一个简单的计数器Bloc:

import 'package:flutter_bloc/flutter_bloc.dart';

enum CounterEvent { increment, decrement }

class CounterState {
  final int count;

  CounterState(this.count);

  // 方便比较两个状态是否相等
  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is CounterState &&
          runtimeType == other.runtimeType &&
          count == other.count;

  @override
  int get hashCode => count.hashCode;
}

class CounterBloc extends Bloc<CounterEvent, CounterState> {
  CounterBloc() : super(CounterState(0));

  @override
  Stream<CounterState> mapEventToState(CounterEvent event) async* {
    if (event == CounterEvent.increment) {
      yield state.copyWith(count: state.count + 1);
    } else if (event == CounterEvent.decrement) {
      yield state.copyWith(count: state.count - 1);
    }
  }
}

5. 在UI中使用Bloc

最后,在你的UI组件中使用Bloc,并触发事件来查看日志记录:

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'counter_bloc.dart'; // 导入上面定义的Bloc

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => CounterBloc(),
      child: Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              BlocBuilder<CounterBloc, CounterState>(
                builder: (context, state) {
                  return Text('Count: ${state.count}');
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () => context.read<CounterBloc>().add(CounterEvent.increment),
                child: Text('Increment'),
              ),
              SizedBox(height: 10),
              ElevatedButton(
                onPressed: () => context.read<CounterBloc>().add(CounterEvent.decrement),
                child: Text('Decrement'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这样,当你运行应用并触发计数器事件时,TalkerBlocLogger会自动记录事件、状态转换和状态变化日志。你可以通过控制台查看这些日志。

回到顶部