首页 > 解决方案 > 当我第一次运行我的颤振代码时,它被重新化了 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

解决方案


Flutter build 方法是在屏幕上创建并返回渲染的小部件,因此每次 UI 中发生更改时都必须调用 build,并且需要重新构建。根据文档

build 方法将在以下时间调用:

  • 调用 initState 后。
  • 调用 didUpdateWidget 之后。
  • 在收到对 setState 的调用后。
  • 在此 State 对象的依赖项发生更改后(例如,先前构建所引用的 InheritedWidget 发生更改)。
  • 在调用 deactivate 然后将 State 对象重新插入到另一个位置的树中。

因此,即使你有一个无状态的 Widget,flutter 也可以并且将会重建多次,这就是为什么你应该避免将逻辑处理程序放在你的 Widget 中,特别是build, 让这个方法尽可能简单,只需要构建 Widget 的实际需要。

此外,在动画、过渡期间......您的小部件将被重建很多次以执行动画。如果你想避免不必要的构建,有一些方法可以做到这一点,通过使用const小部件,如果你认为某个小部件在运行时不会改变,比如Text('Hi')这种小部件只需要构建一次,那么你可以使用const关键字。


推荐阅读