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运行时使用跟踪启动和配置文件选项。

相关文章
|
1月前
|
iOS开发 UED
Flutter 动态修改应用图标功能指南
探索Flutter中动态应用图标的实现方法,了解如何为用户提供独特体验,促进用户升级和应用内购买。
Flutter 动态修改应用图标功能指南
|
3月前
|
安全 数据安全/隐私保护 Android开发
Flutter应用程序加固的问题及解决方案
Flutter应用程序加固的问题及解决方案
55 0
|
3月前
|
存储 安全 数据安全/隐私保护
Flutter应用程序的加固原理
Flutter应用程序的加固原理
44 0
|
3月前
|
监控 Dart 安全
创建一个Dart应用,监控局域网上网记录的软件:Flutter框架的应用
在当今数字时代,网络安全变得愈发重要。为了监控局域网上的上网记录,我们可以借助Flutter框架创建一个强大的Dart应用。在这篇文章中,我们将深入讨论如何使用Flutter框架开发这样一个监控局域网上网记录的软件,并提供一些实用的代码示例。
274 1
|
3月前
|
存储 Dart 数据库
Flutter笔记:状态提升、控制器模式、GetX控制器和服务
Flutter笔记:状态提升、控制器模式、GetX控制器和服务
99 0
|
1月前
|
运维 监控 安全
应用研发平台EMAS常见问题之sophix ios flutter热更新如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是便宜云服务器提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
77 0
|
1月前
|
运维 监控 定位技术
应用研发平台EMAS常见问题之flutter插件不支持自定义图标如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是便宜云服务器提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
76 0
|
2月前
|
Dart JavaScript
Flutter - Dart 基础(数据类型)
【2月更文挑战第3天】
64 1
|
2月前
|
Dart JavaScript 安全
|
2月前
|
Dart Shell 开发工具
解决windows安装Flutter时出现Unknown operating system. Cannot install Dart SDK.问题
解决windows安装Flutter时出现Unknown operating system. Cannot install Dart SDK.问题


http://www.vxiaotou.com