Flutter日志管理插件anadea_flutter_loggy的使用

Flutter日志管理插件anadea_flutter_loggy的使用

特性

  • 日志检查器
  • Dio集成
  • 导航日志记录
  • Bloc日志观察者

入门指南

你可以使用此包与 loggy 包一起。将 loggyanadea_flutter_loggy 依赖添加到你的项目中。

使用方法

在应用构建器中简单地添加检查器包装器。

class ExampleApp extends StatelessWidget {
  const ExampleApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      builder: (context, child) => Inspector(
        child: child!,
      ),
      // 其他配置项
    );
  }
}

Dio集成

为Dio日志记录添加 LogInterceptor 到Dio实例。

final dio = Dio()..interceptors.add(LogInterceptor());

导航集成

LogNavigatorObserver 添加到导航器。

[@override](/user/override)
Widget build(BuildContext context) {
    return MaterialApp(
        navigatorObservers: [LogNavigatorObserver()], // 这一行
        builder: (context, child) => Inspector(
            child: child!,
        ),
        // 其他配置项
    );
}

Bloc集成

为区域添加 LogBlocObserver

void main() {
  BlocOverrides.runZoned(
    () async {
      Loggy.initLoggy(
        logPrinter: StreamPrinter(const PrettyPrinter()),
      );

      runApp(ExampleApp());
    },
    blocObserver: LogBlocObserver(),
  );
}

自定义操作

你可以通过添加自定义操作来扩展检查器的功能。 这基本上只是 AppBar.actions 字段。

...
builder: (context, child) => Inspector(
  customRecordBuilders: {
    TestLogModel: (context, record) => Text(record.object.toString())
  },
  isShow: true,
  actions: [
    IconButton(
      onPressed: () => ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text("Custom action pressed")),
      ),
      icon: const Icon(Icons.favorite),
    )
  ],
  child: child!,
),
...

示例代码

示例代码文件: example/lib/main.dart

import 'package:anadea_flutter_loggy/anadea_flutter_loggy.dart';
import 'package:dio/dio.dart' hide LogInterceptor;
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_loggy/flutter_loggy.dart';
import 'package:loggy/loggy.dart';

import 'bloc/example_bloc.dart';

void main() {
  Loggy.initLoggy(
    logPrinter: StreamPrinter(const PrettyPrinter()),
  );

  Bloc.observer = LogBlocObserver();

  runApp(const ExampleApp());
}

class ExampleApp extends StatelessWidget {
  const ExampleApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorObservers: [LogNavigatorObserver()],
      home: BlocProvider(
        create: (context) => ExampleBloc(),
        child: DemoPage(),
      ),
      builder: (context, child) => Inspector(
        customRecordBuilders: {
          TestLogModel: (context, record) => Text(record.object.toString())
        },
        isShow: true,
        actions: [
          IconButton(
            onPressed: () => ScaffoldMessenger.of(context).showSnackBar(
              const SnackBar(content: Text("Custom action pressed")),
            ),
            icon: const Icon(Icons.favorite),
          )
        ],
        child: child!,
      ),
    );
  }
}

class DemoPage extends StatelessWidget {
  DemoPage({
    Key? key,
  }) : super(key: key);

  final dio = Dio()..interceptors.add(LogInterceptor());

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(
              "Loggy demo",
              style: Theme.of(context).textTheme.titleLarge,
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                logInfo('message');
              },
              child: const Text("log message"),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                logWarning("warning message");
              },
              child: const Text("log warning"),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                logDebug("debug message");
              },
              child: const Text("log debug"),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                logError("error message");
              },
              child: const Text("log error"),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                logError(TestLogModel('content'));
              },
              child: const Text("log speciffic type"),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                dio.get(
                  'http://www.7timer.info/bin/api.pl?lon=113.17&lat=23.09&product=astro&output=json',
                );
                dio.get(
                  'http://www.7timer.info/bn/api.pl?lon=113.17&lat=23.09&product=astro&output=json',
                );
              },
              child: const Text("test dio logs"),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                BlocProvider.of<ExampleBloc>(context)
                    .add(const GetExampleData());
              },
              child: const Text("test bloc logs"),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                Future.delayed(const Duration(seconds: 2)).then(
                  (value) => Navigator.of(context).push(
                    MaterialPageRoute(
                      builder: (context) => const SecondTestScreen(),
                    ),
                  ),
                );
              },
              child: const Text("open second screen with delay"),
            ),
          ],
        ),
      ),
    );
  }
}

class SecondTestScreen extends StatelessWidget {
  const SecondTestScreen({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: const Center(
        child: Text('Second screen'),
      ),
    );
  }
}

class TestLogModel {
  TestLogModel(this.content);

  final String content;
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用anadea_flutter_loggy插件进行日志管理的代码示例。这个插件可以帮助你更好地管理和输出日志信息。

首先,确保你已经在pubspec.yaml文件中添加了anadea_flutter_loggy依赖:

dependencies:
  flutter:
    sdk: flutter
  anadea_flutter_loggy: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来获取依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤使用anadea_flutter_loggy插件:

  1. 导入插件

在你的Dart文件中导入插件:

import 'package:anadea_flutter_loggy/anadea_flutter_loggy.dart';
  1. 配置Loggy

在使用Loggy之前,你可以配置一些选项,比如日志级别、输出格式等。以下是一个配置示例:

void configureLoggy() {
  Loggy.instance
    ..level = LogLevel.verbose // 设置日志级别
    ..output = LogOutput.console // 设置输出目标为控制台
    ..format = LogFormat.json; // 设置日志格式为JSON
}
  1. 初始化Loggy

在应用启动时(比如在main函数中)初始化Loggy:

void main() {
  configureLoggy();
  Loggy.instance.info('App started'); // 记录一条信息日志
  runApp(MyApp());
}
  1. 在代码中使用Loggy

在你的代码中,你可以使用Loggy来记录不同级别的日志:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Loggy.instance.verbose('This is a verbose log message');
    Loggy.instance.debug('This is a debug log message');
    Loggy.instance.info('This is an info log message');
    Loggy.instance.warning('This is a warning log message');
    Loggy.instance.error('This is an error log message');

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Loggy Example'),
        ),
        body: Center(
          child: Text('Check the console for log messages'),
        ),
      ),
    );
  }
}
  1. 运行应用

运行你的Flutter应用,你应该能够在控制台中看到不同级别的日志输出。

这是一个简单的示例,展示了如何使用anadea_flutter_loggy插件进行日志管理。根据实际需求,你可以进一步自定义Loggy的配置,比如将日志输出到文件、远程服务器等。详细的使用方法和配置选项,请参考官方文档(假设官方文档存在并详细)。

回到顶部