flutter - 当我第一次运行我的颤振代码时,它被重新化了 2 次,这是否正常?(我只使用一个类)
问题描述
我是新来的。有点担心,不知道是不是正常的。我知道如果小部件是 type ,代码将呈现StateFulWidget
。但在这种情况下,我有一个stateLessWidget
并且由于某种原因它渲染了 2 次。这是正常的吗?
这是我的代码:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
print("main");
return MaterialApp(title: 'Provider Example', initialRoute: '/', routes: {
'/': (context) => Page2(),
});
}
}
class Page2 extends StatelessWidget {
Page2() {
print("page2");
}
@override
Widget build(BuildContext context) {
return Container();
}
}
这是输出:
Restarted application in 832ms.
I/flutter ( 4439): main
I/flutter ( 4439): page2 --> next two lines are the same, the widget is render again
I/flutter ( 4439): main
I/flutter ( 4439): page2
解决方案
Flutter build 方法是在屏幕上创建并返回渲染的小部件,因此每次 UI 中发生更改时都必须调用 build,并且需要重新构建。根据文档
build 方法将在以下时间调用:
- 调用 initState 后。
- 调用 didUpdateWidget 之后。
- 在收到对 setState 的调用后。
- 在此 State 对象的依赖项发生更改后(例如,先前构建所引用的 InheritedWidget 发生更改)。
- 在调用 deactivate 然后将 State 对象重新插入到另一个位置的树中。
因此,即使你有一个无状态的 Widget,flutter 也可以并且将会重建多次,这就是为什么你应该避免将逻辑处理程序放在你的 Widget 中,特别是build
, 让这个方法尽可能简单,只需要构建 Widget 的实际需要。
此外,在动画、过渡期间......您的小部件将被重建很多次以执行动画。如果你想避免不必要的构建,有一些方法可以做到这一点,通过使用const
小部件,如果你认为某个小部件在运行时不会改变,比如Text('Hi')
这种小部件只需要构建一次,那么你可以使用const
关键字。
推荐阅读
- javascript - 无法从节点向 mysql 表添加值
- node.js - 如何根据条件更新文档的特定属性
- python - Python 使用 Panda 库求均值
- android - Bazaar(Iranian Android Market) 中的更新检查错误
- javascript - 多次上传预览不会保存所有图像
- ios - 如何用动画改变 uicollectionviewcell 的位置?
- java - 使用单线程从 2 个编年史队列中读取
- python - 分页器未显示适当的结果
- python - 使用 beautifulsoup 从 span 标签中抓取数据
- django - 如何在 HTML 页面上预填充 Django 动态添加的表单集字段