Flutter调试工具插件leancode_debug_page的使用

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

Flutter调试工具插件 leancode_debug_page 的使用

leancode_debug_page 是一个用于收集和展示 HTTP 请求和日志的调试页面插件。它可以帮助开发者更方便地查看应用中的网络请求和日志信息,从而加快调试过程。

主要功能

  • 详细信息展示:提供详细的请求(请求、响应)和日志信息。
  • 过滤功能
    • 按状态码或搜索词过滤请求。
    • 按日志级别或搜索词过滤日志。
  • 分享功能:可以分享所有日志/请求或单独的条目。
  • 灵活的入口点配置
    • 可拖动的悬浮按钮。
    • 设备摇晃触发(默认开启)。

界面截图

请求列表

Requests list

请求详情

Request details

日志列表

Logs list

使用方法

基本用法

要使用 leancode_debug_page,您只需将您的 MaterialApp 包装在 DebugPageOverlay 中,并提供一个 DebugPageControllerDebugPageController 需要一个 LoggingHttpClient,它是 http 包中 Client 的包装器,允许您在此处实现自定义客户端。

import 'package:flutter/material.dart';
import 'package:leancode_debug_page/leancode_debug_page.dart';
import 'package:http/http.dart' as http;

class MyApp extends StatefulWidget {
  const MyApp({
    super.key,
    required this.loggingHttpClient,
  });

  final LoggingHttpClient loggingHttpClient;

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late DebugPageController _debugPageController;

  @override
  void initState() {
    super.initState();

    _debugPageController = DebugPageController(
      showEntryButton: true, // 显示悬浮按钮
      loggingHttpClient: widget.loggingHttpClient,
    );
  }

  @override
  Widget build(BuildContext context) {
    return DebugPageOverlay(
      controller: _debugPageController,
      child: MaterialApp(
        title: 'Debug Page Demo',
        theme: ThemeData(
          colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
          useMaterial3: true,
        ),
        home: MyHomePage(
          title: 'Flutter Debug Page Demo Page',
          loggingHttpClient: widget.loggingHttpClient,
        ),
      ),
    );
  }

  @override
  void dispose() {
    _debugPageController.dispose();
    super.dispose();
  }
}

示例代码

以下是一个完整的示例,展示了如何使用 leancode_debug_page 插件:

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:leancode_debug_page/leancode_debug_page.dart';
import 'package:logging/logging.dart';

void main() {
  final loggingHttpClient = LoggingHttpClient();

  runApp(MyApp(loggingHttpClient: loggingHttpClient));
}

class MyApp extends StatefulWidget {
  const MyApp({
    super.key,
    required this.loggingHttpClient,
  });

  final LoggingHttpClient loggingHttpClient;

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late DebugPageController _debugPageController;

  @override
  void initState() {
    super.initState();

    _debugPageController = DebugPageController(
      showEntryButton: true,
      loggingHttpClient: widget.loggingHttpClient,
    );
  }

  @override
  Widget build(BuildContext context) {
    return DebugPageOverlay(
      controller: _debugPageController,
      child: MaterialApp(
        title: 'Debug Page Demo',
        theme: ThemeData(
          colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
          useMaterial3: true,
        ),
        home: MyHomePage(
          title: 'Flutter Debug Page Demo Page',
          loggingHttpClient: widget.loggingHttpClient,
        ),
      ),
    );
  }

  @override
  void dispose() {
    _debugPageController.dispose();
    super.dispose();
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({
    super.key,
    required this.title,
    required this.loggingHttpClient,
  });

  final String title;
  final LoggingHttpClient loggingHttpClient;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _logger = Logger('MyHomePage');

  static final _requests = [
    http.Request('GET', Uri.parse('https://leancode.co/manifest.json')),
    http.Request('GET', Uri.parse('https://leancode.co/api/job-titles')),
    http.Request(
      'GET',
      Uri.parse('https://leancodelanding2.cdn.prismic.io/api/v2'),
    ),
    http.Request('GET', Uri.parse('https://leancode.co')),
    http.Request('POST', Uri.parse('https://leancode.co'))
      ..body = {'some key': 'some value'}.toString(),
    http.Request('GET', Uri.parse('https://leancode.co/non-existing-path')),
  ];

  Future<void> _sendRequest() async {
    final randomIndex = Random().nextInt(_requests.length);
    final request = copyRequest(_requests[randomIndex]);
    final response = await widget.loggingHttpClient.send(request);

    await http.Response.fromStream(response);

    if (response.statusCode < 400) {
      _logger.info('Received a response from remote server (${response.statusCode})');
    } else {
      _logger.severe('Request failed with status code ${response.statusCode}');
    }

    if (randomIndex % 3 == 0) {
      _logger.info('Some very long log' * 100);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () => showDialog(
                  context: context,
                  builder: (context) => const Dialog(
                    child: Padding(
                      padding: EdgeInsets.all(24),
                      child: Text('Some dialog'),
                    ),
                  ),
                ),
                child: const Text('Show a dialog'),
              ),
              const SizedBox(height: 16),
              ElevatedButton(
                onPressed: () {
                  Overlay.of(context).insert(
                    OverlayEntry(
                      opaque: true,
                      builder: (context) => Container(
                        color: Colors.red,
                        alignment: Alignment.center,
                        child: const Material(
                          color: Colors.transparent,
                          child: Text(
                            'Overlay',
                            style: TextStyle(
                              color: Colors.white,
                              fontSize: 24,
                            ),
                          ),
                        ),
                      ),
                    ),
                  );
                },
                child: const Text('Show an overlay'),
              ),
            ],
          ),
        ),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.startFloat,
      floatingActionButton: FloatingActionButton.extended(
        label: const Text('Send request'),
        icon: const Icon(Icons.send),
        tooltip: 'Send a request',
        onPressed: _sendRequest,
      ),
    );
  }
}

入口点配置

您可以通过设置 DebugPageController 构造函数中的 showEntryButton(默认为 false)和 showOnShake(默认为 true)标志来配置调试页面的入口点。

注意事项

该插件依赖于监听 Logger.root 来收集日志。这意味着修改 Logger.root.level 会影响插件的行为,并且日志仅从当前隔离区收集。


希望这个指南能帮助您快速上手 leancode_debug_page 插件。更多详细信息和完整示例请参考 官方示例


更多关于Flutter调试工具插件leancode_debug_page的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter调试工具插件leancode_debug_page的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用leancode_debug_page调试工具插件的一个代码案例。leancode_debug_page是一个帮助开发者在Flutter应用中快速查看和调试信息的工具。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  leancode_debug_page: ^最新版本号 # 请替换为最新版本号

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

2. 初始化插件

在你的应用的主入口(通常是main.dart)中,初始化leancode_debug_page插件。

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

void main() {
  // 初始化 LeanCode Debug Page
  LeanCodeDebugPage.init();

  runApp(MyApp());
}

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text('Hello, Flutter!'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 显示调试页面(通常只在开发阶段使用)
          if (kDebugMode) {
            LeanCodeDebugPage.showDebugPage();
          }
        },
        tooltip: 'Debug',
        child: Icon(Icons.debug),
      ),
    );
  }
}

3. 使用调试页面

在上面的代码中,我们在MyHomePage中添加了一个FloatingActionButton,当点击这个按钮时,如果应用处于调试模式(kDebugModetrue),则会显示leancode_debug_page的调试页面。

4. 添加调试信息

你可以在应用的任何地方添加你想要调试的信息。例如,你可以在应用的某个业务逻辑中添加一些调试信息:

void someBusinessLogic() {
  // 一些业务逻辑
  LeanCodeDebugPage.addLog('业务逻辑开始执行');

  // 模拟一些操作
  Future.delayed(Duration(seconds: 1), () {
    LeanCodeDebugPage.addLog('业务逻辑执行完毕');
  });
}

5. 运行应用

现在,运行你的Flutter应用。在点击浮动操作按钮后,你应该能看到leancode_debug_page提供的调试页面,其中包含了你添加的日志信息和其他可能的调试数据。

这个插件非常有用,因为它允许开发者在不改变应用UI的情况下,动态地查看和调试应用的状态和日志。注意,出于安全考虑,调试页面通常只在开发阶段启用,发布到生产环境时应确保禁用或移除相关代码。

回到顶部