Flutter 确定小部件是否位于前台/后台

Flutter 确定小部件是否位于前台/后台,flutter,dart,Flutter,Dart,假设我有一个带有两个屏幕的颤振应用程序——屏幕a和屏幕B。ScreenA只是一个ListView,它显示一个项目列表,但需要在列表更改时执行网络调用,然后更新列表。ScreenB可以修改项目列表,但我希望ScreenA仅在ScreenA位于前台并显示时执行网络调用。据我所知,我不能轻易做到这一点。当在屏幕B之间导航时,屏幕A不会被释放并重新初始化。如果StatefulWidget具有要覆盖的onfront和onBackground方法,这将非常有用,但它们没有。这个问题也不是导航独有的,但在使用

假设我有一个带有两个屏幕的颤振应用程序——屏幕
a
和屏幕
B
。Screen
A
只是一个
ListView
,它显示一个项目列表,但需要在列表更改时执行网络调用,然后更新列表。Screen
B
可以修改项目列表,但我希望Screen
A
仅在Screen
A
位于前台并显示时执行网络调用。据我所知,我不能轻易做到这一点。当在屏幕
B
之间导航时,屏幕
A
不会被释放并重新初始化。如果
StatefulWidget
具有要覆盖的
onfront
onBackground
方法,这将非常有用,但它们没有。这个问题也不是导航独有的,但在使用全屏页面时,同样的问题也会出现。是否有适当/标准的实施方法

我当前的设置如下:我让父窗口小部件同时进入
A
B
屏幕,在
ValueNotifier
中保存列表,并在构建它们时将其传递给这两个屏幕。然后,屏幕
A
侦听
ValueNotifier
上的更改,并在任何时候执行网络调用。因此,为了确定屏幕
A
是否在前台/后台,我必须在导航之前/之后开始/停止监听更改。但是我还没有开始实现这个功能,因为我认为当小部件树下的小部件触发导航或者其他小部件需要知道它们是否在前台/后台时,它会变得复杂

我想到的另一个选择是,与其观察列表中的更改,不如从屏幕
B
返回一个结果,说明列表是否更改,然后做出反应。但我可以想出很多方法,这也会使我的代码复杂化,因为我真正的应用程序不仅仅涉及一个依赖项。我必须为每个屏幕创建一个自定义的结果类,其中包含所有更改数据的记录,如果我想在将来添加更多数据,这将是一件乏味的事情。我将如何处理导航到屏幕
B
然后屏幕
C
?结果必须保留并向下传递,以便屏幕
A
可以对屏幕
C
所做的更改作出反应。我还必须确保对
Navigator.pop
的所有调用都包含结果,并用结果覆盖按下
pop
的后退按钮。而且我还必须确保结果能够传递给需要对更改做出反应的适当小部件

我只是错过了一些简单的事情来完成这一点吗?我不是最有经验的颤振,如果有一些简单的解决方案我还没有学会,我也不会感到惊讶


编辑:经过一些测试后,它似乎执行了与
vsync
参数类似的操作,即当
状态处于后台或未绘制时,它不会更新。因此,我可以在屏幕
A
的状态中使用
SingleTickerProviderStateMixin
,然后使用
createTicker
创建
Ticker
,然后在列表更改时检查
Ticker.isTicking
。如果它在滴答作响,屏幕
A
在前台,否则它在后台。虽然我不确定这是否是一个好方法,因为它似乎只用于
动画
,并且没有像我这样的用例的文档记录。

从**B**(子)调用**a**(父)并强制刷新它,这不是我想要做的。当屏幕
B
在前台时,我不想刷新屏幕
A
(或执行网络呼叫)。是的,这是我的工作,我在我的应用程序中是如何做到的?这里是一个示例,好的,我明白你的意思。但这与从屏幕
B
返回结果基本相同。它适用于具有简单窗口小部件树和几个屏幕(如您的示例中所示)的应用程序,但当您添加启动导航或具有更多屏幕的窗口小部件时,它会变得更加复杂。在您的示例中,如果
TaskAddPageWidget
导航到另一个修改任务的屏幕,则必须确保
TasksPageWidget
仅在两个屏幕都完成时调用
刷新
。观察任务会容易得多,只有当任务发生变化且列表位于前台时,才会刷新任务。