根据 iOS 环境主题自动在明暗之间更改 iOS 应用主题

Changing iOS App theme automatically between light and dark depending on iOS environmental theme

好的,所以我之前对这个特定主题做了很多研究,我知道这是 Flutter 开发人员尚未实现自动运行的功能(设置明暗主题在打开应用程序时动态更改检查)但我知道这是可能的。我不希望我的用户需要做出这个选择,而且我知道我很接近,但我遗漏了一些重要的东西。我来解释一下:

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

这两行代码应该通过布尔值(深色主题 true 或 false)传递到我的代码中。这些代码行是 运行,但它们会引发错误。

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 Widget 中,但这也不起作用,因为你不能真正在里面进行函数调用,我需要将主题传递到那里,因为那样会产生影响整个节目主题。

从本质上讲,它看起来像一个先有鸡还是先有蛋的场景,在我有媒体查询之前我不能设置主题,在我已经设置之前我不能做媒体查询主题,它否定了查询的全部目的。

有什么想法吗?

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

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

行内
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.

}

这样,您就可以在需要的时候设置主题状态,而不是我想象中的先有鸡还是先有蛋的场景。

希望这对某人有所帮助。

将 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(),
          );
        },
      ),
    );
  }
}

这样,任何默认文本都会自动解析为白色或黑色,具体取决于平台亮度设置。

示例结果: