【问题标题】:Flutter: programmatically cause darkTheme to be usedFlutter:以编程方式导致使用 darkTheme
【发布时间】:2019-10-18 16:47:48
【问题描述】:

在 Flutter 中,您可以设置要使用的深色主题,在某些情况下将使用该主题(例如,Android Q 上设置了深色模式)。是否有推荐的方法允许以编程方式覆盖它?例如,响应用户偏好?

我想这可以在应用程序的最顶层完成:

MaterialApp(
    theme: ThemeData.light(),
    darkTheme: ThemeData.dark(),
    themeMode: fromSomeState,
)

但是,我还希望能够在应用程序的各个点以编程方式打开应用程序是否处于暗模式(例如,用于图像选择):

MediaQuery.of(context).platformBrightness == Brightness.dark;

我也可以尝试更新MediaQueryData 以覆盖platformBrightness,但这只能在MaterialApp 内部完成,这似乎很尴尬。

有没有更好的模式来做这种事情?

【问题讨论】:

    标签: flutter android-dark-theme


    【解决方案1】:

    您可以查看dynamic_theme

    如何使用

    只需将Dynamic Theme 添加为MaterialApp 的父级

    DynamicTheme(
      defaultBrightness: Brightness.light,
      data: (brightness) => new ThemeData(
        primarySwatch: Colors.indigo,
        brightness: brightness,
      ),
      themedWidgetBuilder: (context, theme) {
        return new MaterialApp(
            .......
        );
      }
    )
    

    使用

    获取currentBrightness
        DynamicTheme.of(context).brightness;
    

    并使用

    设置它
        DynamicTheme.of(context).setBrightness(Theme.of(context).brightness == Brightness.dark? Brightness.light: Brightness.dark);
    

    您可以阅读有关它的更多信息或创建自己的内容,请查看此媒体Post

    已编辑

    您可以使用检查当前操作系统主题

    MediaQuery.of(context).platformBrightness;
    

    并相应地设置主题。

    【讨论】:

    • 看起来很方便,但我想如果用户没有指定固定的偏好,您如何检测操作系统已请求暗模式仍然存在问题。
    • 您可以查看当前的操作系统主题并进行相应设置,参见编辑部分。
    • 这里不是有点鸡和蛋吗?如果你想使用MediaQuery 来设置DynamicTheme.defaultBrightness,你需要在MaterialApp 内,但这是在DynamicTheme 内构建的...?
    • 是的,但是如果我们将 MaterialApp 设为 Dynamic Theme 的父级呢?
    猜你喜欢
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多