flutter - 如何使用 darkTheme 在颤动中更改主题:
问题描述
为了在我的 MaterialApp() 中管理主题,我使用:
MaterialApp(
...
theme: isDarkTheme ? darkTheme() : lightTheme(),
)
darkTheme()
并且lightTheme()
只是返回的简单函数ThemeData()
因此,我使用继承的 Widget 来更改变量isDarkTheme
,然后我使用该setState((){})
方法并重建所有应用程序
但是,我在 Flutter 文档中看到我们可以使用darkTheme:
.
我正在尝试这样做:
MaterialApp(
...
theme: lightTheme(),
darkTheme: darkTheme()
)
我们可以在申请过程中更改主题
解决方案
darkTheme
属性用于定义Theme
设备进入黑暗模式时使用的属性,因此您不能强制您的应用使用darkTheme
属性,因为它取决于MediaQueryData.platformBrightness
哪个值是只读字段。
您可以定义几个主题用作Theme
属性值,并在应用程序过程中通过使用StreamBuilder
包裹在它们之间进行切换MaterialApp
,这不会导致应用程序停止和重建,就像您使用setState
更改时的情况一样主题(您需要rxdart包来应用以下解决方案):
//BehaviorSubject stream any changes immediately without explicit call
var themeSubject = BehaviorSubject<ThemeData>();
//This way the app won't rebuild when the user selects the same theme
Stream<ThemeData> getTheme() => themeSubject.stream.distinct();
void setTheme (MaterialColor color){
pointsSubject.sink.add(ThemeData(primarySwatch: color) ;
}
return StreamBuilder<ThemeData>(
stream: getTheme(),
initialData: ThemeData(
primarySwatch: Colors.blue,
primaryTextTheme: TextTheme(
title: TextStyle(color: Colors.white),
),
builder: (context, themeSnapshot){
return MaterialApp(theme: themeSnapshot.data);
}
):
然后使用您InheritedWidget
的访问setTheme
并随意更改它。
推荐阅读
- python - 为什么我需要在 render() 中指定 HTML 文件
- python - 遍历 200 个数据集
- windows - 如何解决 Windows 10 中的 URL 无法识别错误?
- python - 为什么第 18 行的 if 语句不能防止错误“列表索引超出范围”
- java - 使用 java 从目录中选择特定文件
- javascript - javascript递归函数给出错误
- android - 损坏的序列化解析结果。使用firebase ui依赖时找不到选定的模块
- python - ValueError: too many values to unpack (expected 2) ,当我尝试从正则表达式模式中仅提取 2 个子字符串时
- laravel - Laravel Eager Load 在条件关系中变为空
- swift - 使用 Github Actions 运行 firebase 模拟器 - CI iOS 项目