如何使用ThemeData为相同的窗口小部件类型设置不同的颜色? [扑]

时间:2019-10-29 08:05:48

标签: flutter

我一直在尝试查找有关如何在抖动中实现ThemeData的示例和教程。尽管它们中的大多数似乎很容易实现,但是我还没有找到任何示例,其中一种小部件类型(例如:文本,FlatButton,卡片等)能够同时具有多种颜色。

在我的应用程序中,如果我有两个字符串:“在这里输入任务”和“今天的任务-$ {cardList.length}”,则可以定义单个ThemeData,第一个字符串可以使用一种颜色,第二个字符串可以使用其他颜色?

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:1)

这是一篇很好的文章,解释了如何做:Dynamic theming with Flutter

基本上,您必须创建一个CustomTheme来处理当前选定的ThemeData,并用此CustomTheme包装您的应用。然后,您可以从任何地方更改当前选定的主题:

  
      
  • 我们将主题更改为CustomTheme.instanceOf(context).changeTheme(ourThemeKey)
  •   
  • 所做的更改会触发setState有状态小部件内的新值,以CustomTheme更新主题。
  •   
     

由于setStateCustomTheme得以重建。继承的小部件获取   也要重新构建,并且由于其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)。