Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据iOS环境主题在明暗之间自动更改iOS应用程序主题_Ios_Flutter_Media Queries_Themes - Fatal编程技术网

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

根据iOS环境主题在明暗之间自动更改iOS应用程序主题,ios,flutter,media-queries,themes,Ios,Flutter,Media Queries,Themes,好的,我之前已经对这个特定的主题做了相当多的研究,我知道这是一个功能,颤振开发者还没有实现自动运行(在打开应用程序时设置光明和黑暗主题以动态更改),但我知道这是可能的。我不希望我的用户需要做出这个选择,我知道我很接近,但我错过了一些重要的东西。我会解释: final Brightness brightnessValue = MediaQuery.of(context).platformBrightness; bool isDark = brightnessValue == Brightness.

好的,我之前已经对这个特定的主题做了相当多的研究,我知道这是一个功能,颤振开发者还没有实现自动运行(在打开应用程序时设置光明和黑暗主题以动态更改),但我知道这是可能的。我不希望我的用户需要做出这个选择,我知道我很接近,但我错过了一些重要的东西。我会解释:

final Brightness brightnessValue = MediaQuery.of(context).platformBrightness;
bool isDark = brightnessValue == Brightness.dark;
这两行代码应该通过一个布尔值(暗主题true或false)进入我的代码。这些代码行正在运行,但它们抛出了一个错误

使用不包含MediaQuery的上下文调用MediaQuery.of()。从传递给MediaQuery.of()的上下文开始,找不到MediaQuery祖先。这可能是因为您没有WidgetsApp或MaterialApp小部件(这些小部件引入MediaQuery),或者如果您使用的上下文来自这些小部件上方的小部件,则可能会发生这种情况。)。所使用的上下文是: MyApp 另见:

现在我看到一些人实现了这一行代码,它对他们很有效,所以我知道这不是语法问题。事实上,我把这行代码放在一个widgets应用程序下面,就像他们问的那样,(就我所理解的这些事情而言,所以我很困惑

相关代码:

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>
    ),
  }
}
CupertinoThemeData当前主题;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
最终亮度亮度值=MediaQuery.of(context).platformBrightness;
bool isDark=亮度值==亮度.dark;

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

诀窍在于,是的,您实际上需要将选择主题的代码放在行中

return CupertinoApp( <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(),
          );
        },
      ),
    );
  }
}
这样,根据平台亮度设置,任何默认文本将自动解析为白色或黑色

样本结果:


你能在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(),
          );
        },
      ),
    );
  }
}