Flutter框架对热重载在项目里的深度运用,状态热重新加载以及静态字段被延迟初始化【Flutter】

简介: Flutter框架对热重载在项目里的深度运用,状态热重新加载以及静态字段被延迟初始化【Flutter】

@[toc]

热重载

要热重新加载Flutter应用程序:
从受支持的IntelliJ IDE或终端窗口运行应用程序。物理机和虚拟机都可以运行。
修改项目中的Dart文件。大多数类型的代码更改都可以重新加载;

class myWidget extends StatelessWidget {
  Widget build(BuildContext context) {
    return new GestureDetector(onTap: () => print('T'));
  }
}

Flutter的热重新加载功能可以帮助快速轻松地测试、构建用户界面、添加功能和修复错误,而无需重新启动应用程序。热重新加载是通过将更新的源代码文件注入正在运行的Dart虚拟机(VM)来实现的。在虚拟机用新的字段和函数更新类之后,Flutter框架将自动重建小部件树,以便可以快速查看更改的效果。

Performing hot reload...
Reloaded 1 of 448 libraries in 2,777ms.

如果使用IntelliJ IDE,请选择“全部保存”(cmd-s/ctrl-s),或单击工具栏上的“热重新加载”按钮。
如果使用命令行flutter run运行应用程序,请在终端窗口中输入r
成功热重新加载后,将在控制台中看到类似以下内容的消息。

class myWidget extends StatefulWidget {
  @override
  State createState() => new myWidgetState();
}
class myWidgetState {
...
...
}

状态热重新加载

Flutter的热重新加载功能(有时称为有状态热重新加载)保留了应用程序的状态。此设计允许仅查看最近更改的效果,而不放弃当前状态。例如,如果应用程序需要用户登录,则可以在导航层次结构中修改并重新加载页面,而无需重新输入登录凭据。状态保持不变,这通常是所需的行为。

myWidget is not a subtype of StatelessWidget

如果代码更改影响应用程序的状态(或其依赖关系),则应用程序必须使用的数据可能与从头开始执行的数据不完全一致。在热过载和完全重新启动后,结果可能是不同的行为。例如,如果将StatelessWidget类更改为StatefulWidget(反之亦然),则热重新加载后应用程序的先前状态将保持不变。但是,此状态可能与新更改不兼容。

静态字段被延迟初始化

运行应用程序后,如果进行以下更改:

final sampleTable = [
  new Table("T1"),
  new Table("T2"),
  new Table("T3"),
  new Table("T4"),
];

在Dart中,静态字段被延迟初始化。这意味着第一次运行Flutter应用程序并读取静态字段时,其初始值将设置为初始表达式的结果。全局变量和静态字段被视为状态,因此在热重新加载期间不会重新初始化。
如果更改全局变量和静态字段的初始化器,则需要完全重新启动以查看更改。

const foo = 1;
final bar = foo;
void onClick(){
  print(foo);
  print(bar);
}

然后热重新加载,现在打印2和1。对常量字段值的更改始终会重新加载,但静态字段初始值设定项语句不会重新运行(初始值可能是表达式的值)。从概念上讲,常量字段被视为别名而不是状态。

final bar = foo;

当一组更改需要完全重新启动才能生效时,Dart VM将检测初始化程序更改并标记。以上示例中的大多数初始化工作都会触发标记机制,但不适用于以下情况:

const bar = foo;

即使热重新加载操作看似成功且未引发异常,但某些代码更改可能在刷新的UI中不可见。更改应用程序的main()方法后,这种行为很常见。

作为一般规则,如果修改的代码位于根小部件的构建方法的下游,则热重载将按预期运行。但是,如果由于重新构建小部件树,修改后的代码不会被重新执行,那么在热重新加载后,将看不到其效果。都

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  Widget build(BuildContext context) {
    return new GestureDetector(
      onTap: () => print('tapped'));
  }
}

在完全重新启动后,程序从头开始执行main()的新版本,并构建一个小部件树以显示文本“Hello”。
但是,如果在更改后重新加载应用程序,main()将不会被重新执行,未修改的实例MyApp将被用作新构建的小部件树的根。热重新加载后,结果不会改变。

  class Color {
    Color(this.i, this.j);
    final Int i;
    final Int j;
      }
相关文章
|
2月前
|
设计模式 前端开发 测试技术
Flutter 项目架构技术指南
探讨Flutter项目代码组织架构的关键方面和建议。了解设计原则SOLID、Clean Architecture,以及架构模式MVC、MVP、MVVM,如何有机结合使用,打造优秀的应用架构。
116 1
Flutter 项目架构技术指南
|
2月前
|
监控 Dart 安全
创建一个Dart应用,监控局域网上网记录的软件:Flutter框架的应用
在当今数字时代,网络安全变得愈发重要。为了监控局域网上的上网记录,我们可以借助Flutter框架创建一个强大的Dart应用。在这篇文章中,我们将深入讨论如何使用Flutter框架开发这样一个监控局域网上网记录的软件,并提供一些实用的代码示例。
305 1
|
16天前
|
开发框架 移动开发 Android开发
构建高效移动应用:探索Flutter开发框架
【6月更文挑战第28天】随着移动设备的普及,用户对移动应用的需求日益增长。开发者面临着在众多平台间提供无缝体验的挑战。本文深入探讨了Flutter框架如何通过其跨平台特性、热重载功能以及丰富的组件库简化移动应用的开发流程,同时确保高性能和优雅的用户界面设计。
26 2
|
19天前
|
移动开发 Dart 前端开发
探秘移动开发新纪元:Flutter框架的跨平台魅力
Flutter,谷歌的开源UI工具包,不仅革新前端开发,其跨平台特性延伸至后端,通过Dart语言统一开发流程,提升效率与一致性。使用Aqueduct框架,开发者可构建REST API,如创建新项目、定义数据模型和控制器,实现前后端同栈开发。Flutter与Dart的结合正重塑移动开发,开启全栈新纪元。
48 2
|
11天前
|
Dart Android开发 iOS开发
flutter 创建项目、运行项目、项目目录
flutter 创建项目、运行项目、项目目录
12 0
|
12天前
Flutter-加载中动画
Flutter-加载中动画
|
1月前
|
开发框架 开发者 UED
Flutter作为一款跨平台的移动应用开发框架,自然也提供了丰富的工具和功能来支持可访问性和无障碍设计
【6月更文挑战第11天】Flutter是一款注重可访问性设计的跨平台移动应用开发框架,提供语义化组件、文本缩放、对比度调整、动态内容更新通知和键盘导航等功能,支持无障碍体验。开发者应结合简化操作、清晰反馈、多输入方式支持及测试优化等原则,以创建包容性更强的应用,满足不同用户需求,体现社会责任。
33 1
|
1月前
|
开发框架 Dart 开发工具
|
27天前
|
开发框架 Rust Dart
Flutter、Electron 和 Tauri 框架简介
Flutter、Electron 和 Tauri 框架简介
25 0
|
2月前
|
数据库 Android开发
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画

相关实验场景

更多