Flutter:在运行的应用程序中获得显示模式(暗/正常)更改的通知

时间:2019-09-30 12:30:48

标签: flutter

我使用一个检查MediaQuery.of(context).platformBrightness以确定平台暗模式设置的函数:

这是从didChangeAppLifecycleState()开始并在启动过程中调用的-它通常可以正常工作,只是我发现需要最小化并重新打开该应用程序才能接收更新的显示模式。

当应用程序进入前台时,MediaQuery platformBrightness值似乎未更新,但如果仅使应用程序最小化并将其放回原处,则它是正确的。这是在使用SDK 29.0.2的Pie模拟器上。

有没有一种方法可以直接收听有关平台黑暗模式的通知?

注意:我不使用Flutter Theme引擎的原因有很多-应用程序主题比Flutter提供的主题更复杂,并且为用户提供了优先设置以覆盖黑暗模式/强制正常设置该应用可以使用深色模式或正常模式,甚至可以为旧版Android提供深色和正常模式。但是,当用户为暗/正常显示模式选择“自动”时,该应用应遵循平台模式,并且即使该用户实际上并未离开该应用,实际上也应进行切换,例如仅拉下阴影并设置暗模式开启或关闭。为此,我需要一种监听事件的方法。

更新: 进一步的测试表明MediaQuery实际上已经更新,但是当调用didChangeAppLifecycleState()时,该值仍反映旧值。

例如,以下作品:

@override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(
    if (displayModePreferenceSetting == DISPLAY_MODE_AUTO) {
      Timer(Duration(milliseconds: 333), () {
        switchDisplayMode(DISPLAY_MODE_AUTO);
      });
    }
  }

1 个答案:

答案 0 :(得分:0)

这比我想的要简单得多,尽管我不得不偶然找到答案。

状态小部件可让您覆盖方法 struct ExpenseRow: View{ var expense: Expense var body: some View { HStack{ Text(expense.name) Spacer() Text("$\(expense.price)") } } } struct Expense: Identifiable{ var id = UUID().uuidString var name: String var price: Int }

示例:

didChangePlatformBrightness()