Flutter 在Navigator.pushNamed更改到另一个屏幕的路径后,颤振构建旧屏幕?

Flutter 在Navigator.pushNamed更改到另一个屏幕的路径后,颤振构建旧屏幕?,flutter,Flutter,我注意到,当我在屏幕之间移动并按路线时,例如 Navigator.pushNamed(context, "/screenNumberTwo"); 我的源屏幕上的build方法(我们称之为screenNumberOne)在screenNumberTwo的build方法之后被调用(尽管只有第二个屏幕可见)。如果我在MaterialButton中按on移动,以及在InkWell中按onTap移动,在有参数和无参数的路由情况下,我都会看到这种情况 我的路线如下所示 class MyApp extend

我注意到,当我在屏幕之间移动并按路线时,例如

Navigator.pushNamed(context, "/screenNumberTwo");
我的源屏幕上的build方法(我们称之为screenNumberOne)在
screenNumberTwo
的build方法之后被调用(尽管只有第二个屏幕可见)。如果我在
MaterialButton
中按
on
移动,以及在
InkWell
中按
onTap
移动,在有参数和无参数的路由情况下,我都会看到这种情况

我的路线如下所示

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        onGenerateTitle: (BuildContext context) =>
            Localization.of(context).appTitle,
        initialRoute: "/",
        routes: {
          "/": (context) => FirstScreen(),
          "/select_category": (context) => SecondScreen(),
        },
        onGenerateRoute: (routeSettings) {
          print("Route: ${routeSettings.name}");
          var path = routeSettings.name.split('/');

          if (path[1] == 'thirdscreen') {
            if (path.length == 3) {
            //(... where I set paramId)
              return new MaterialPageRoute(
                  builder: (context) => new ThirdScreen(paramId),
                  settings: routeSettings);
            } else if (path.length == 4) {
            //(... where I set paramId and param2Id)
              return new MaterialPageRoute(
                  builder: (context) => new ThirdScreen(
                        paramId, param2Id,
                      ),
                  settings: routeSettings);
            }
        },
        localizationsDelegates: [
          const LocalizationDelegate(),
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate,
        ],
        supportedLocales: [
          const Locale('en'),
          const Locale('pl'),
        ]);
  }
}

这不是一个功能问题,更多的是一个问题,在我的例子中,颤振是在计算屏幕上燃烧CPU,而用户无论如何都不会看到它。。。如有任何建议,请更改内容/在何处查找问题,我们将不胜感激

这是正常的。出于各种原因,颤振可以调用
build
函数。它还可以在动画等情况下重复调用它。这就是为什么在
build
中不应该有昂贵的计算。另一方面,由于这是颤振设计的核心,因此整个构建机制非常高效(例如,垃圾收集器设计用于处理所有这些新的、短期的小部件对象的创建)


为了实现60FPS的动画效果,Flatter将以该帧速率调用build,因此一个额外的不需要的build并不重要。

似乎动画导致调用build。但是,我在文档中没有找到对此的具体解释。也许这个答案会有帮助:我认为你没有回答OP的问题。我们都知道build()可以被多次调用,但为什么要调用当前未激活的旧屏幕呢?“我也有同样的问题。”彼得·阿尔文,检查一下。一位《颤栗》撰稿人说“这正按预期工作”,这与理查德·希普在回答中的回答相同。