说我有一个Flutter应用,它有两个屏幕-屏幕A
和屏幕B
。屏幕A
只是一个ListView
,显示项目列表,但是每当列表更改时都需要执行网络呼叫,然后更新列表。屏幕B
可以修改项目列表,但我希望屏幕A
仅在屏幕A
处于前台并显示时才执行网络通话。据我所知,我不能轻易做到这一点。导航到屏幕A
和从屏幕B
导航时,屏幕StatefulWidget
不会被处置并重新初始化。如果onForeground
具有onBackground
和PageView
方法可以覆盖,但它们没有覆盖,这将非常有帮助。此问题也不只是导航所独有,但是在全屏页面上使用A
时也会出现同样的问题。是否有一些适当/标准的方法来实现这一点?
我当前的设置如下:我让同时位于B
和ValueNotifier
屏幕的父窗口小部件将列表保存在A
中,并在构造它们时将其传递给两个屏幕。然后,屏幕ValueNotifier
监听A
上的更改,并在每次进行时进行网络呼叫。因此,为了确定屏幕B
是否在前景/背景中,我将不得不在导航之前/之后开始/停止监听更改。但是我还没有开始实现它,因为我认为当位于窗口小部件树下方的窗口小部件触发导航或其他窗口小部件需要知道它们是否位于前景/背景中时,它将变得复杂。
我想到的另一种选择是代替观察列表中的更改,而宁愿从屏幕B
返回结果,说列表是否已更改,然后做出反应。但是我可以想到很多方法,这也可以使我的代码复杂化,因为我的真实应用程序不仅仅涉及一个依赖项。我将必须为每个屏幕创建一个自定义结果类,其中包含所有已更改数据的记录,如果将来我想添加更多数据,这将很繁琐。以及如何导航到屏幕C
然后导航到屏幕A
?结果必须保留并向下传递,以便屏幕C
可以对屏幕Navigator.pop
所做的更改做出反应。我还必须确保对pop
的所有调用都包含该结果,并用返回键覆盖对AnimationController
的结果。而且我还必须确保结果能够放入需要对更改做出反应的适当小部件。
我只是缺少一些简单的方法来完成此操作吗?我不是Flutter经验最丰富的人,如果我还没有找到一些简单的解决方案,我也不会感到惊讶。
编辑:经过更多测试之后,看来vsync
的操作与我使用State
参数所需的操作类似,因为SingleTickerProviderStateMixin
不会在{{ 1}}在后台或未绘制时。因此,我可以在屏幕A
的状态上使用createTicker
,然后使用Ticker
创建一个Ticker.isTicking
,然后在列表中检查A
变化。如果正在滴答作响,则屏幕Ticker
在前景中,否则在背景中。尽管我不确定这是否是一种好方法,但由于看起来Animation
实际上仅用于{
"_id": "unique1",
"companyBases": [
{
"_id": "company base 1",
"vehicles": [
....some objects
]
},
{
"_id": "company base 2",
"vehicles": [
....some objects
]
},
{
"_id": "company base 3",
"vehicles": [
....some objects
]
}
]
}
,并且没有类似我的用例的文档。