根据 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(),
);
},
),
);
}
}
这样,任何默认文本都会自动解析为白色或黑色,具体取决于平台亮度设置。
示例结果:
好的,所以我之前对这个特定主题做了很多研究,我知道这是 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(),
);
},
),
);
}
}
这样,任何默认文本都会自动解析为白色或黑色,具体取决于平台亮度设置。
示例结果: