flutter - 按下按钮时如何更改颤动主题颜色
问题描述
我正在尝试制作一个具有动态主题颜色的应用程序,我的想法是当用户点击一个按钮时,应用程序的某些部分(按钮、appbar、themeData ...)会发生变化。但我不知道该怎么做,我尝试了一些 if 条件,静态变量....但没有任何效果,知道怎么做吗?
我想为应用程序放置 3 个不同的主题,这是我放置应用程序主题的主文件:
void main() {
runApp(CharlotApp());
}
class CharlotApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Fluttter colors',
theme: ThemeData(
primaryColor: MyTheme.kPrimaryColor,
accentColor: MyTheme.kAccentColor,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: SplashScreen());
}
}
解决方案
您可以使用此链接上共享的相同方法:
final _themeGlobalKey = new GlobalKey(debugLabel: 'app_theme');
class AppTheme extends StatefulWidget {
final child;
AppTheme({
this.child,
}) : super(key: _themeGlobalKey);
@override
AppThemeState createState() => new AppThemeState();
}
class AppThemeState extends State<AppTheme> {
ThemeData _theme = DEV_THEME;
set theme(newTheme) {
if (newTheme != _theme) {
setState(() => _theme = newTheme);
}
}
@override
Widget build(BuildContext context) {
return new ThemeChanger(
appThemeKey: _themeGlobalKey,
child: new Theme(
data: _theme,
child: widget.child,
),
);
}
}
class ThemeChanger extends InheritedWidget {
static ThemeChanger of(BuildContext context) {
return context.inheritFromWidgetOfExactType(ThemeChanger);
}
final ThemeData theme;
final GlobalKey _appThemeKey;
ThemeChanger({
appThemeKey,
this.theme,
child
}) : _appThemeKey = appThemeKey, super(child: child);
set appTheme(AppThemeOption theme) {
switch (theme) {
case AppThemeOption.experimental:
(_appThemeKey.currentState as AppThemeState)?.theme = EXPERIMENT_THEME;
break;
case AppThemeOption.dev:
(_appThemeKey.currentState as AppThemeState)?.theme = DEV_THEME;
break;
}
}
@override
bool updateShouldNotify(ThemeChanger oldWidget) {
return oldWidget.theme == theme;
}
}
在您想更改主题的其他班级
setState(() {
ThemeChanger.of(context).appTheme = appThemeLight;
});
推荐阅读
- android - 是否可以将动画持续时间的一部分分配给要动画的特定值?
- python - 为什么 str(random.choice()) 返回 /string/
- html - 无法使用 bs4 提取表
- vim - vim:处理 .vim_runtime/sources_non_forked/tlib/plugin/02tlib.vim 时检测到错误:
- postgresql - dbeaver 和其他连接以某种方式消耗 postgresql 服务器内存
- javascript - 谷歌浏览器可以阻止创建 csrf 令牌吗?
- sql - ORA-00937: 不是单组分组函数,已在使用 group by
- go - 编译 Go 时,我在修订版 v0.0.2 处收到以下错误 github.com/xxxxx/xxxxx/go.mod:未知修订版 v0.0.2
- swift - 文本字段部分间距上方的 SwiftUI 表单标签
- c++ - C++ - 如何以独立于平台、线程安全的方式以用户首选的日期/时间语言环境格式格式化文件的最后修改日期和时间