【问题标题】:Changing iOS App theme automatically between light and dark depending on iOS environmental theme根据 iOS 环境主题在明暗之间自动更改 iOS App 主题
【发布时间】:2020-05-13 05:30:56
【问题描述】:

好的,所以我之前已经对这个特定主题进行了相当多的研究,我知道这是 Flutter 开发人员尚未实现自动运行的功能(将浅色和深色主题设置为打开应用程序时动态检查更改)但我知道这是可能的。我不希望我的用户需要做出这个选择,我知道我很接近,但我错过了一些重要的事情。我来解释一下:

final Brightness brightnessValue = MediaQuery.of(context).platformBrightness;
bool isDark = brightnessValue == Brightness.dark;

这两行代码应该通过一个布尔值(深色主题真或假)进入我的代码。这些代码行正在运行,但它们会引发错误。

MediaQuery.of() 使用不包含 MediaQuery 的上下文调用。从传递给 MediaQuery.of() 的上下文开始,找不到 MediaQuery 祖先。这可能是因为您没有 WidgetsApp 或 MaterialApp 小部件(这些小部件引入了 MediaQuery),或者如果您使用的上下文来自这些小部件上方的小部件,则可能会发生这种情况。)。使用的上下文是: 我的应用 也可以看看: https://flutter.dev/docs/testing/errors

现在我已经看到一些人实现了这行代码并且它适用于他们,所以我知道这不是语法问题。我实际上是按照他们的要求将这行代码放在一个小部件应用程序下面,(据我了解这些事情,所以我受阻。

相关代码:

CupertinoThemeData currentTheme;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    final Brightness brightnessValue = MediaQuery.of(context).platformBrightness;
    bool isDark = brightnessValue == Brightness.dark;
    <CODE TO SELECT THEME DEPENDING ON PHONE'S THEME.  Setting parameters of currentTheme>

    return CupertinoApp(
      <CODE FOR APP>
    ),
  }
}

现在我会把它放在 CupertinoApp 小部件中,但这也不起作用,因为你不能在里面真正进行函数调用,我需要将主题传递到那里,因为这会影响整体的节目主题。

本质上,它看起来像先有鸡还是先有蛋的场景,在我拥有媒体查询之前我无法设置主题,并且在我已经设置主题之前我无法进行媒体查询,这否定了查询的全部目的。

有什么想法吗?

【问题讨论】:

    标签: ios flutter media-queries themes


    【解决方案1】:

    将 DefaultTextStyle 小部件放置在小部件树顶部附近的某处是一个很好的解决方法。请记住,它必须比 CupertinoApp 低一级,否则它无法使用其构建上下文找到继承的主题。

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return CupertinoApp(
          home: Builder(
            builder: (BuildContext context) {
              return DefaultTextStyle(
                style: CupertinoTheme.of(context).textTheme.textStyle,
                child: MyHomePage(),
              );
            },
          ),
        );
      }
    }
    

    这样,任何默认文本都会根据平台亮度设置自动解析为白色或黑色。

    示例结果:

    【讨论】:

      【解决方案2】:

      在我的头撞到砖墙上几个小时后,终于弄明白了(对于其他有类似问题的人)。

      诀窍是,是的,您确实需要将选择主题的代码放在行内

      return CupertinoApp( <Here> )
      

      您可以通过以下方式做到这一点:

      builder: (BuildContext context, Widget child) {
      
         final Brightness brightnessValue = MediaQuery.of(context).platformBrightness;
         bool isDark = brightnessValue == Brightness.dark; 
      
         // All your code to set your two themes, light and dark can go here.
      
      }
      

      通过这种方式,您可以在需要时设置主题状态,而不是我想象的鸡与蛋场景。

      希望这对某人有所帮助。

      【讨论】:

      • 你能放更多代码吗,比如你是如何在 CupertinoApp 中使用构建器的?
      猜你喜欢
      • 1970-01-01
      • 2022-07-19
      • 2020-09-12
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多