我一直在尝试查找有关如何在抖动中实现ThemeData
的示例和教程。尽管它们中的大多数似乎很容易实现,但是我还没有找到任何示例,其中一种小部件类型(例如:文本,FlatButton,卡片等)能够同时具有多种颜色。
在我的应用程序中,如果我有两个字符串:“在这里输入任务”和“今天的任务-$ {cardList.length}”,则可以定义单个ThemeData
,第一个字符串可以使用一种颜色,第二个字符串可以使用其他颜色?
答案 0 :(得分:1)
这是一篇很好的文章,解释了如何做:Dynamic theming with Flutter
基本上,您必须创建一个CustomTheme
来处理当前选定的ThemeData
,并用此CustomTheme
包装您的应用。然后,您可以从任何地方更改当前选定的主题:
- 我们将主题更改为
CustomTheme.instanceOf(context).changeTheme(ourThemeKey)
。- 所做的更改会触发
setState
有状态小部件内的新值,以CustomTheme
更新主题。由于
setState
,CustomTheme
得以重建。继承的小部件获取 也要重新构建,并且由于其updateShouldNotify
返回true
依赖的小部件(在我们的示例中为MaterialApp
)已更新,从而导致 使用新的配色方案进行UI更新。
使用此解决方案,您可以拥有任意数量的不同主题。
答案 1 :(得分:0)
您可以定义默认主题(例如浅色)和深色主题(如here所述)
MaterialApp(
theme: ThemeData(
brightness: Brightness.light,
primaryColor: Colors.red,
),
darkTheme: ThemeData(
brightness: Brightness.dark,
),
);
在每个ThemeData
实例中,您可以定义ButtonTheme
以及所有其他实例。
答案 2 :(得分:0)
我以这种方式使用它们:
首先在materialApp中初始化主题和darktheme属性,或者根据需要创建一个简单的类。
MaterialApp(
theme: ThemeData(
brightness: Brightness.light,
primaryColor: Colors.red,
),
darkTheme: ThemeData(
brightness: Brightness.dark,
primaryColor: Colors.grey,
),
);
然后在需要的地方使用它:
Container(
color: Theme.of(context).primaryColor,
child: Text(
'Text with a background color',
),
);
您还可以使用它来定义多个textStyles,也可以定义其他颜色(如accentColors)。