其他
热重载 (Hot reload)
Flutter 的热重载功能可帮助您在无需重新启动应用程序的情况下快速、轻松地测试、构建用户界面、添加功能以及修复错误。通过将更新的源代码文件注入到正在运行的 Dart 虚拟机(VM)来实现热重载。在虚拟机使用新的字段和函数更新类之后, Flutter 框架会自动重新构建 widget 树,以便您可以快速查看更改的效果。
要热重载 Flutter 应用程序:
(1)在支持 Flutter 编辑器 或终端窗口运行应用程序,物理机或虚拟器都可以。 Flutter 应用程序只有在调试模式下才能被热重载。
(2)修改项目中的一个Dart文件。大多数类型的代码更改可以热重载;一些需要重新启动应用程序的更改列表,请参阅 限制。
(3)如果您在支持 Flutter IDE 工具的 IDE /编辑器中工作,请选择 Save All (cmd-s
/ctrl-s
),或单击工具栏上的 Hot Reload 按钮。
如果您正在使用命令行 flutter run
运行应用程序,请在终端窗口输入 r
。
成功执行热重载后,您将在控制台中看到类似于以下内容的消息:
Performing hot reload...
Reloaded 1 of 448 libraries in 978ms.
Hot reload was rejected:
'/Users/obiwan/Library/Developer/CoreSimulator/Devices/AC94F0FF-16F7-46C8-B4BF-218B73C547AC/data/Containers/Data/Application/4F72B076-42AD-44A4-A7CF-57D9F93E895E/tmp/ios_testWIDYdS/ios_test/lib/main.dart': warning: line 16 pos 38: unbalanced '{' opens here
Widget build(BuildContext context) {
^
'/Users/obiwan/Library/Developer/CoreSimulator/Devices/AC94F0FF-16F7-46C8-B4BF-218B73C547AC/data/Containers/Data/Application/4F72B076-42AD-44A4-A7CF-57D9F93E895E/tmp/ios_testWIDYdS/ios_test/lib/main.dart': error: line 33 pos 5: unbalanced ')'
);
^
class MyWidget extends StatelessWidget {
Widget build(BuildContext context) {
return GestureDetector(onTap: () => print('T'));
}
}
class MyWidget extends StatefulWidget {
State<MyWidget> createState() => MyWidgetState();
}
class MyWidgetState extends State<MyWidget> { /*...*/ }
MyWidget is not a subtype of StatelessWidget
final sampleTable = [
Table("T1"),
Table("T2"),
Table("T3"),
Table("T4"),
];
final sampleTable = [
Table("T1"),
Table("T2"),
Table("T3"),
Table("T10"), // modified
];
const foo = 1;
final bar = foo;
void onClick() {
print(foo);
print(bar);
}
1
和 1
。然后,如果您进行以下更改:const foo = 2; // modified
final bar = foo;
void onClick() {
print(foo);
print(bar);
}
2
和 1
。虽然对 const 定义的字段值的更改始终会重新加载,但不会重新运行静态字段的初始化语句。从概念上讲,const 字段被视为别名而不是状态。final bar = foo;
foo
并在热重载后查看更改,应该将字段重新用 const 定义或使用 getter 来返回值,而不是使用 final。例如:const bar = foo;
get bar => foo;
main()
方法后很常见。import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return GestureDetector(onTap: () => print('tapped'));
}
}
import 'package:flutter/widgets.dart';
void main() {
runApp(const Center(
child: const Text('Hello', textDirection: TextDirection.ltr)));
}
main()
方法,并构建一个 widget 树来显示文本 Hello
。main()
方法则不会重新执行,并且会使用未修改的 MyApp
实例作为根 widget 树来构建新的 widget 树,热重载后结果没有变化。更改
initState()
方法,热重载后不会产生效果,需要重新启动。枚举类型更改为常规类或常规类更改为枚举类型。例如,如果您更改:
enum Color {
red,
green,
blue
}
class Color {
Color(this.i, this.j);
final int i;
final int j;
}
泛型类声明被修改。例如,如果您更改:
class A<T> {
T i;
}
class A<T, V> {
T i;
V v;
}
任何有代码更改的文件; 应用程序的主入口文件。 受主入口文件影响的文件。