【问题标题】:Flutter: avoid build() method of previous route being called when navigate to next routeFlutter:避免在导航到下一条路线时调用上一条路线的 build() 方法
【发布时间】:2020-03-08 23:55:54
【问题描述】:

我的颤振应用程序显示初始屏幕 (statefulWidget) 作为第一条路线。这条路线正在显示一个动画,同时在后台调用 API 来获取一些数据。

一旦接收到数据并且动画完成,它就会导航到第二条路线。

一切正常,除了调用Navigator 导航到第二条路线时,会显示第二条路线,但我可以再次看到 API 对第一条路线的响应,即被调用。

原来,在构建第二条路由的时候,也调用了前一条路由的build方法,又进行了一次不必要的API调用。

如何避免这种行为?,我相信这一定是Flutter上的一个错误??

当前流程(不需要):SplashRoute(build) ---> Navigator ---> HomeRoute(build)+SplashRoute(build)

所需流程:SplashRoute(build) ---> Navigator ---> HomeRoute(build)

【问题讨论】:

  • 我有一个问题......动画将使构建方法几乎在每一帧都被调用。你在构建函数中调用你的api吗?它不会在动画的这段时间内调用数千个 api 吗??
  • 不,我用的是其他类型的动画,不是你想的那种动画

标签: flutter dart build navigator statefulwidget


【解决方案1】:

您正在尝试做的是针对框架工作。这是徒劳的努力。相反,您应该使用框架。以下是原因和方法:

构建方法不应发出 API 请求。构建方法应该使用状态类的字段来生成没有任何副作用的 UI。

请将您的 API 调用移至 initState 方法,使用 setState 将其结果保存在您的状态类的字段中,并获取 build 方法以使用它们而不会产生任何副作用。

【讨论】:

  • 这是一个非常好的建议,谢谢,它解决了双API调用的问题,但是关于不必要地调用以前的路由构建的问题仍然存在。
  • 我不认为 Flutter 对调用构建函数的次数做出任何保证。他们实际上告诉我们准备好因为各种原因多次调用它。我不会担心的。以下是有关此特定情况的更多信息:github.com/flutter/flutter/issues/11655
  • @GazihanAlankus 例如,我在 build 方法中有一个流构建器,它与 firestore 快照映射。即使路由在后台,它也会导致不需要的 Firestore 读取。除了构建方法本身,我应该在哪里使用这个流构建器?
  • Please move your API calls to the initState method 我正在做同样的事情,但它仍然在后台进行 api 调用。
  • @RobertWilliams 如果你在initState 这样做,我相信这不应该发生。不看细节很难说。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
相关资源
最近更新 更多