在Navigator.pushNamed更改路由到另一个屏幕之后,颤振建立旧屏幕?

时间:2019-02-01 12:52:23

标签: flutter

我已经注意到,当我的屏幕和推路线例如之间移动

Navigator.pushNamed(context, "/screenNumberTwo");

我的源屏幕上的构建方法(我们称其为 screenNumberOne )在screenNumberTwo的构建方法之后被调用(尽管只有第二个屏幕可见)。如果在有参数且没有参数的情况下使用onPressed中的MaterialButtononTap中的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'),
        ]);
  }
}

这不是一个功能性问题,更令人担忧的是,在我的情况下,抖动是正在计算屏幕上烧毁的CPU,无论如何用户都不会看到它。有关更改/查找问题的任何建议是感谢!

1 个答案:

答案 0 :(得分:0)

这是正常现象。 Flutter可以出于各种原因调用build函数。在动画等情况下,它也可以反复调用它。这就是为什么build中应该没有昂贵的计算的原因。另一方面,由于这是Flutter设计的核心,因此整个构建机制非常高效(例如,垃圾收集器旨在始终应对所有这些新的,短暂的窗口小部件对象的创建) )。

要获得60FPS动画,Flutter将以该帧速率调用构建,因此再也不需要多余的构建了。