Flutter日志显示插件flutter_log_overlay的使用

Flutter日志显示插件flutter_log_overlay的使用

在本教程中,我们将展示如何使用flutter_log_overlay插件来显示Flutter应用的日志信息。这个插件允许你在应用运行时查看详细的日志输出,这对于调试和监控应用的行为非常有用。

使用方法

初始化插件

首先,你需要在应用启动时初始化flutter_log_overlay插件。这通常在你的主页面或初始页面中完成。

[@override](/user/override)
void initState() {
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_) {
    FlutterLogOverlay.init(context: context);
  });
}

显示日志面板

要显示日志面板,你可以调用FlutterLogOverlay.show()方法。

ElevatedButton(
  onPressed: FlutterLogOverlay.show,
  child: Text('显示日志'),
)

自定义日志记录器

为了更好地控制日志输出,你可以创建一个自定义的日志记录器。这里我们创建了一个名为MyLogger的类,并重写了其log方法以包含额外的日志信息。

final sLog = MyLogger(
  printer: PrettyPrinter(
    methodCount: 0,
    errorMethodCount: 0,
    printEmojis: false,
    printTime: true,
  ),
);

class MyLogger extends Logger {
  LogFilter? filter;
  LogPrinter? printer;
  LogOutput? output;
  Level? level;

  MyLogger({
    this.filter,
    this.printer,
    this.output,
    this.level,
  }) : super(
          filter: filter,
          printer: printer,
          output: output,
          level: level,
        );

  [@override](/user/override)
  void log(
    Level level,
    dynamic message, [
    dynamic error,
    StackTrace? stackTrace,
  ]) {
    _startTime = DateTime.now();
    FlutterLogOverlay.addLog(
      isCore: level == Level.error,
      content: [
        getTime(),
        "--------------------",
        ((printer ?? PrettyPrinter()) as PrettyPrinter)
            .stringifyMessage(message),
      ],
    );
    super.log(
      level,
      message,
      error != null || stackTrace != null
          ? [
              error,
              stackTrace,
            ]
          : null,
    );
  }

  DateTime? _startTime;

  String getTime() {
    var now = DateTime.now();
    var year = _fourDigits(now.year);
    var month = _twoDigits(now.month);
    var day = _twoDigits(now.day);
    var h = _twoDigits(now.hour);
    var min = _twoDigits(now.minute);
    var sec = _twoDigits(now.second);
    var ms = _threeDigits(now.millisecond);
    var timeSinceStart = now.difference(_startTime!).toString();
    return '$year-$month-$day $h:$min:$sec.$ms (+$timeSinceStart)';
  }

  String _fourDigits(int n) {
    if (n >= 1000) return '$n';
    if (n >= 100) return '0$n';
    if (n >= 10) return '00$n';
    return '000$n';
  }

  String _threeDigits(int n) {
    if (n >= 100) return '$n';
    if (n >= 10) return '0$n';
    return '00$n';
  }

  String _twoDigits(int n) {
    if (n >= 10) return '$n';
    return '0$n';
  }
}

添加手势识别

你还可以添加手势识别功能,以便通过滑动手势来显示日志面板。

[@override](/user/override)
Widget build(BuildContext context) {
  return GestureDetector(
    onPanEnd: FlutterLogOverlay.showOverlayPan,
    behavior: HitTestBehavior.translucent,
    child: const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: FirstPgae(),
    ),
  );
}

示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用flutter_log_overlay插件。

import 'package:flutter/material.dart';
import 'package:flutter_log_overlay/flutter_log_overlay.dart';
import 'package:logger/logger.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return GestureDetector(
      onPanEnd: FlutterLogOverlay.showOverlayPan,
      behavior: HitTestBehavior.translucent,
      child: const MaterialApp(
        debugShowCheckedModeBanner: false,
        home: FirstPgae(),
      ),
    );
  }
}

///first page
class FirstPgae extends StatefulWidget {
  const FirstPgae({
    super.key,
  });

  [@override](/user/override)
  State<FirstPgae> createState() => _FirstPgaeState();
}

class _FirstPgaeState extends State<FirstPgae> {
  int _counter = 0;

  void _incrementCounter() {
    sLog.i('first page add:$_counter');
    _counter++;
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      FlutterLogOverlay.init(context: context);
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('first page'),
        actions: [
          IconButton(
            onPressed: () {
              Navigator.of(context).push(
                MaterialPageRoute(
                  builder: (context) => const SecondPage(),
                ),
              );
            },
            icon: const Icon(Icons.navigate_next),
          ),
        ],
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: const [
            ElevatedButton(
              onPressed: FlutterLogOverlay.show,
              child: Text('显示日志'),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

///second page
class SecondPage extends StatefulWidget {
  const SecondPage({super.key});

  [@override](/user/override)
  State<SecondPage> createState() => _SecondPageState();
}

class _SecondPageState extends State<SecondPage> {
  int _counter = 0;

  void _incrementCounter() {
    sLog.i('second page add:$_counter');
    _counter++;
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('second page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: const [
            ElevatedButton(
              onPressed: FlutterLogOverlay.show,
              child: Text('显示日志'),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

final sLog = MyLogger(
  printer: PrettyPrinter(
    methodCount: 0,
    errorMethodCount: 0,
    printEmojis: false,
    printTime: true,
  ),
);

///类方法重构,增加FlutterLogOverlay.addLog打印日志
class MyLogger extends Logger {
  LogFilter? filter;
  LogPrinter? printer;
  LogOutput? output;
  Level? level;

  MyLogger({
    this.filter,
    this.printer,
    this.output,
    this.level,
  }) : super(
          filter: filter,
          printer: printer,
          output: output,
          level: level,
        );

  [@override](/user/override)
  void log(
    Level level,
    dynamic message, [
    dynamic error,
    StackTrace? stackTrace,
  ]) {
    _startTime = DateTime.now();
    FlutterLogOverlay.addLog(
      isCore: level == Level.error,
      content: [
        getTime(),
        "--------------------",
        ((printer ?? PrettyPrinter()) as PrettyPrinter)
            .stringifyMessage(message),
      ],
    );
    super.log(
      level,
      message,
      error != null || stackTrace != null
          ? [
              error,
              stackTrace,
            ]
          : null,
    );
  }

  DateTime? _startTime;

  String getTime() {
    var now = DateTime.now();
    var year = _fourDigits(now.year);
    var month = _twoDigits(now.month);
    var day = _twoDigits(now.day);
    var h = _twoDigits(now.hour);
    var min = _twoDigits(now.minute);
    var sec = _twoDigits(now.second);
    var ms = _threeDigits(now.millisecond);
    var timeSinceStart = now.difference(_startTime!).toString();
    return '$year-$month-$day $h:$min:$sec.$ms (+$timeSinceStart)';
  }

  String _fourDigits(int n) {
    if (n >= 1000) return '$n';
    if (n >= 100) return '0$n';
    if (n >= 10) return '00$n';
    return '000$n';
  }

  String _threeDigits(int n) {
    if (n >= 100) return '$n';
    if (n >= 10) return '0$n';
    return '00$n';
  }

  String _twoDigits(int n) {
    if (n >= 10) return '$n';
    return '0$n';
  }
}

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

1 回复

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


flutter_log_overlay 是一个用于在 Flutter 应用中显示日志的插件。它允许你在应用界面上实时查看日志信息,而不需要依赖调试控制台。这对于在真机上调试应用时非常有用,因为你可以直接在屏幕上看到日志输出。

安装 flutter_log_overlay

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

dependencies:
  flutter:
    sdk: flutter
  flutter_log_overlay: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

使用 flutter_log_overlay

  1. 导入包

    在你的 Dart 文件中导入 flutter_log_overlay

    import 'package:flutter_log_overlay/flutter_log_overlay.dart';
    
  2. 初始化日志覆盖层

    在你的 main.dart 文件中初始化日志覆盖层。通常,你可以在 main 函数中调用 LogOverlay.init()

    void main() {
      WidgetsFlutterBinding.ensureInitialized();
      LogOverlay.init();  // 初始化日志覆盖层
      runApp(MyApp());
    }
    
  3. 显示日志

    你可以在应用的任何地方使用 LogOverlay.printLog() 来输出日志信息:

    LogOverlay.printLog('This is a log message');
    
  4. 启用/禁用日志覆盖层

    你可以通过调用 LogOverlay.enable()LogOverlay.disable() 来动态启用或禁用日志覆盖层:

    LogOverlay.enable();  // 启用日志覆盖层
    LogOverlay.disable(); // 禁用日志覆盖层
    
  5. 自定义日志覆盖层

    你可以通过 LogOverlay.setStyle() 来自定义日志覆盖层的样式,例如背景颜色、字体大小等:

    LogOverlay.setStyle(
      backgroundColor: Colors.black.withOpacity(0.8),
      textColor: Colors.white,
      fontSize: 14.0,
    );
    

示例代码

以下是一个完整的示例代码,展示了如何使用 flutter_log_overlay

import 'package:flutter/material.dart';
import 'package:flutter_log_overlay/flutter_log_overlay.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  LogOverlay.init();  // 初始化日志覆盖层
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Log Overlay Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Log Overlay Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            LogOverlay.printLog('Button Pressed!');  // 输出日志
          },
          child: Text('Press Me'),
        ),
      ),
    );
  }
}
回到顶部