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

Lec*_*dal 5 flutter

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

Navigator.pushNamed(context, "/screenNumberTwo");
Run Code Online (Sandbox Code Playgroud)

我的源屏幕上的构建方法(我们称之为screenNumberOne)在构建方法之后被调用screenNumberTwo(尽管只有第二个屏幕可见)。如果我使用onPressedinMaterialButtononTapin移动InkWell,无论是带参数还是不带参数的路由,我都会看到这种情况发生。

我的路由如下完成

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'),
        ]);
  }
}
Run Code Online (Sandbox Code Playgroud)

这不是一个功能问题,更多的是一个问题,在我的例子中,颤动正在烧毁计算屏幕上的CPU,而该屏幕无论如何都不会呈现给用户......任何建议更改什么/在哪里寻找问题,我们将不胜感激!

Ric*_*eap 0

这个是正常的。Flutter 可以build出于各种原因调用该函数。它还可以在动画等情况下重复调用它。这就是为什么build. 另一方面,由于这是 Flutter 设计的核心,整个构建机制非常高效(例如垃圾收集器被设计为始终处理所有这些新的、短命的 widget 对象的创建) )。

为了实现 60FPS 动画,Flutter 将以该帧速率调用构建,因此额外的不需要的构建并不重要。

  • 我认为你没有回答OP的问题。我们都知道 build() 可以被调用多次,但是为什么对于当前不活动的旧屏幕呢?我有同样的问题。 (2认同)