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