【发布时间】:2020-06-18 07:01:13
【问题描述】:
我需要根据主题更改小部件的color。我有单独的ThemeData 用于明暗主题。现在是否可以向ThemeData 添加自定义属性,以便我可以根据主题更改小部件的颜色并使用该自定义属性?
【问题讨论】:
我需要根据主题更改小部件的color。我有单独的ThemeData 用于明暗主题。现在是否可以向ThemeData 添加自定义属性,以便我可以根据主题更改小部件的颜色并使用该自定义属性?
【问题讨论】:
遗憾的是,you simply can't - 考虑到他们的建议,Flutter 团队似乎没有兴趣添加它。
我认为这是一个重大缺陷,因为我们无法从 Theme.of(context) 自动更新所有使用此 ThemeData 的 Widget。
虽然有些人可能会说您可以使用扩展来添加新属性,但您实际上不知道如何区分多个 ThemeData(除非您可以使用像 Brightness 这样的属性,但我认为这也是hacky,这样做不可靠)。
另一种方法是创建另一个InheritedWidget(就像他们在上面提到的问题中所说的那样)来处理您的自定义主题属性。
编辑:似乎new PR 引入了扩展ThemeData 的可能性,但它还没有登陆 main 甚至还没有稳定。
【讨论】:
extension,并且可以有动态主题。我已经添加了答案。
Brightness 之类的属性在多个ThemeData 之间进行区分。尽管如此,我还是对您的回答添加了更深入的回应。
我们可以通过extension 函数扩展ThemeData,而不是添加自定义属性。例如,如果我们需要自定义颜色属性,我们可以在ColorScheme 上添加extension 函数。 Color 依赖项现已移至 Themedata。
// checking brightness to support dynamic themeing
extension CustomColorSchemeX on ColorScheme {
Color get smallBoxColor1 =>
brightness == Brightness.light ? Colors.blue : Colors.grey[400];
}
然后通过Theme.of(context)...访问该属性
Container(
decoration: BoxDecoration(
border: Border.all(
color: Theme.of(context)
.colorScheme
.smallBoxColor1),
),
【讨论】:
ThemeData。你会如何区分它们?只需使用Brightness?您所做的只是针对特定情况的一种解决方法,即人们只有 2 个不同的主题,它们的“亮度”不同。