Flutter如何调试应用【Dart Observatory 】以及调试模式断言

简介: Flutter如何调试应用【Dart Observatory 】以及调试模式断言

@[toc]

Flutter如何调试应用

我们上面写了Flutter测试应用,这远远不够,这篇,我们来写一下Flutter如何调试应用:

void someFunction(double offset) {
  debugger(when: offset > 30.0);
}

在运行应用程序之前,请运行颤振分析来测试代码。该工具(它是darthanalysis工具的包装)将分析代码并帮助查找可能的错误。如果使用IntelliJ的Flutter插件,它将自动启用。

Dart Observatory

Dart解析器大量使用代码中的类型注释来帮助跟踪问题。我们鼓励在任何地方使用它们(避免使用var、无类型参数、无类型列表文本等),因为这是跟踪问题的最快方法。

使用Dart Observatory(或其他Dart调试器,如IntelliJ IDE中的那些)时,可以使用调试器()语句插入编程断点。要使用此函数,必须添加import“dart:developer”;转到相关文档的顶部。
调试器()语句采用可选的when参数,只有当特定条件为真时,才能指定该参数中断

import 'package:flutter/material.dart';

void main() {
  runApp(
    new MaterialApp(
      home: new AppHome(),
    ),
  );
}

Dart print()函数将输出到系统控制台,可以使用flutter日志来查看它(基本上是一个包装器adb-logcat)。
如果一次输出太多,Android有时会丢弃一些日志行。为了避免这种情况,可以在Flutter的基础库中使用debugPrint()。这是一个包打印,它将输出限制在一个级别,以避免被Android内核丢弃。

I/flutter ( 6559): └MaterialApp(state: _MaterialAppState(1009803148))
I/flutter ( 6559):  └ScrollConfiguration()
I/flutter ( 6559):   └AnimatedTheme(duration: 200ms; state: _AnimatedThemeState(543295893; ticker inactive; 

Flutter框架中的许多类都有toString实现。根据惯例,这些输出通常包括对象的runtimeType单行输出,通常是表单中的ClassName(有关此实例的更多信息…)。树中使用的一些类还具有toStringDeep,它返回整个子树的多行描述。一些包含toString详细信息的类将实现一个toStringShort,它只返回对象类型或其他非常简短(一个或两个单词)的描述。

class AppHome extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Material(
      child: new Center(
        child: new FlatButton(
          onPressed: () {
            debugDumpApp();
          },
          child: new Text('Dump App'),
        ),
      ),
    );
  }

调试模式断言

在开发过程中,强烈建议使用Flutter的“调试”模式,有时也称为“检查”模式。如果使用颤振运行程序。在这种模式下,Dart断言语句被启用,Flutter框架使用它来执行许多运行时检查,以验证是否违反了一些不可变规则。
当不可变规则被违反时,它会向控制台报告一些上下文信息,以帮助跟踪问题的根本原因。

family: "monospace"; size: 48.0; weight: 900; decoration: double Color(0xffffff00) TextDecoration.underline)
I/flutter ( 6559):          └MediaQuery(MediaQueryData(size: Size(411.4, 683.4), devicePixelRatio: 2.625, textScaleFactor: 1.0, padding: EdgeInsets(0.0, 24.0, 0.0, 0.0)))

要关闭调试模式并使用释放模式,请使用flutterrun--release运行应用程序。这也会关闭Observatory调试器。中间模式可以关闭除Observatory之外的所有调试辅助工具。它被称为“概要模式”,可以使用--profile而不是--release。
调试应用程序层
Flutter框架的每一层都提供将其当前状态或事件转储到控制台的功能(使用debugPrint)。
控件层
要转储Widgets库的状态,请调用debugDumpApp()。只要应用程序至少构建了一次(即,在调用build()之后的任何时间),就可以在应用程序不处于构建阶段(即,不在build(方法中调用)的任何时间调用此方法(在调用runApp()之后)。

I/flutter :  │ creator: [root]
I/flutter :  │ offset: Offset(0.0, 0.0)
I/flutter :  │ transform:
I/flutter :  │   [0] 3.5,0.0,0.0,0.0
I/flutter :  │   [1] 0.0,3.5,0.0,0.0
I/flutter :  │   [2] 0.0,0.0,1.0,0.0
I/flutter :  │   [3] 0.0,0.0,0.0,1.0

这是一个“扁平”的树,显示了通过各种构建函数投影的所有小部件(如果在小部件树的根中调用了StringDeepwidget,这就是得到的树)。将看到许多小部件没有出现在应用程序源代码中,因为它们是由框架小部件的build()函数插入的。例如,InkFeature是Material小部件的一个实现细节。

I/flutter : ▄▄▄▄▄▄▄▄ Frame 12         30s 437.086ms ▄▄▄▄▄▄▄▄
I/flutter : Debug print: Am I performing this work more than once per frame?
I/flutter : Debug print: Am I performing this work more than once per frame?
I/flutter : ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

因为当按钮从按下变为释放时调用debugDumpApp(),所以FlatButton对象同时调用setState(),因此它将自己标记为脏。这就是为什么如果查看转储,就会发现特定对象被标记为“脏”。还可以查看哪些手势收听者已注册;在这种情况下,将列出一个GestureDetector,并侦听“轻敲”手势(“轻敲”由TapGesture检测器的toStringShort函数输出)
如果编写自己的小部件,则可以通过重写debugFillProperties()来添加信息。将DiagnosticsProperty对象作为方法参数并调用父方法。toString方法使用此函数来填充小部件描述信息。

I/flutter : SemanticsNode(0; Rect.fromLTRB(0.0, 0.0, 411.4, 683.4))
I/flutter :  ├SemanticsNode(1; Rect.fromLTRB(0.0, 0.0, 411.4, 683.4))
I/flutter :  │ └SemanticsNode(2; Rect.fromLTRB(0.0, 0.0, 411.4, 683.4); canBeTapped)
I/flutter :  └SemanticsNode(3; Rect.fromLTRB(0.0, 0.0, 411.4, 683.4))
I/flutter :    └SemanticsNode(4; Rect.fromLTRB(0.0, 0.0, 82.0, 36.0); canBeTapped; "Dump App")

如果试图调试布局问题,Widgets层树可能不够详细。在这种情况下,可以通过调用debugDumpRenderTree()来转储渲染树。就像debugDumpApp()一样,除了在布局或绘图阶段,可以随时调用此函数。一般来说,从帧回调或事件处理程序调用它是最好的解决方案。
要调用debugDumpRenderTree(),需要添加import包:flatter/rendering。部分';到源文件。

$ flutter run --trace-startup --profile

要收集有关Flutter应用程序启动所需时间的详细信息,可以在运行Flutter运行时使用跟踪启动和配置文件选项。

相关文章
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
186 4
|
2月前
|
缓存 监控 前端开发
优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面
本文探讨了优化 Flutter 应用启动速度的策略,涵盖理解启动过程、资源加载优化、减少初始化工作、界面布局优化、异步初始化、预加载关键数据、性能监控与分析等方面,并通过案例分析展示了具体措施和效果,强调了持续优化的重要性及未来优化方向。
64 10
|
2月前
|
存储 调度 数据安全/隐私保护
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
鸿蒙应用打包上架流程包括创建应用、打包签名和上传应用。首先,在AppGallery Connect中创建项目、APP ID和元服务。接着,使用Deveco进行手动签名,生成.p12和.csr文件,并在AppGallery Connect中上传CSR文件获取证书。最后,配置签名并打包生成.app文件,上传至应用市场。常见问题包括检查签名配置文件是否正确。参考资料:[应用/服务签名](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-signing-V5)。
68 3
鸿蒙Flutter实战:13-鸿蒙应用打包上架流程
|
2月前
|
开发工具 芯片 开发者
鸿蒙Flutter实战:12-使用模拟器开发调试
本文介绍了如何在 M 系列芯片的 Mac 电脑上使用模拟器进行鸿蒙 Flutter 开发和调试。主要内容包括:创建 Flutter 项目、签名、创建模拟器、运行 Flutter 项目以及常见问题的解决方法。适用于希望在鸿蒙系统上开发 Flutter 应用的开发者。
62 2
鸿蒙Flutter实战:12-使用模拟器开发调试
|
2月前
|
开发框架 Dart 前端开发
Flutter 是谷歌推出的一款高效跨平台移动应用开发框架,使用 Dart 语言,具备快速开发、跨平台支持、高性能、热重载及美观界面等特点。
Flutter 是谷歌推出的一款高效跨平台移动应用开发框架,使用 Dart 语言,具备快速开发、跨平台支持、高性能、热重载及美观界面等特点。本文从 Flutter 简介、特点、开发环境搭建、应用架构、组件详解、路由管理、状态管理、与原生代码交互、性能优化、应用发布与部署及未来趋势等方面,全面解析 Flutter 技术,助你掌握这一前沿开发工具。
64 8
|
2月前
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
55 8
|
2月前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
45 2
|
2月前
|
存储 开发者
Flutter&鸿蒙next 使用 BLoC 模式进行状态管理详解
本文详细介绍了如何在 Flutter 中使用 BLoC 模式进行状态管理。BLoC 模式通过将业务逻辑与 UI 层分离,利用 Streams 和 Sinks 实现状态管理和 UI 更新,提高代码的可维护性和可测试性。文章涵盖了 BLoC 的基本概念、实现步骤及代码示例,包括定义 Event 和 State 类、创建 Bloc 类、提供 Bloc 实例以及通过 BlocBuilder 更新 UI。通过一个简单的计数器应用示例,展示了 BLoC 模式的具体应用和代码实现。
100 1
|
2月前
|
Dart
flutter dart mixin 姿势
flutter dart mixin 姿势
|
3月前
|
移动开发 Dart 搜索推荐
打造个性化安卓应用:从零开始的Flutter之旅
【10月更文挑战第20天】本文将引导你开启Flutter开发之旅,通过简单易懂的语言和步骤,让你了解如何从零开始构建一个安卓应用。我们将一起探索Flutter的魅力,实现快速开发,并见证代码示例如何生动地转化为用户界面。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供价值。