【问题标题】:Add custom property to ThemeData in Flutter在 Flutter 中为 ThemeData 添加自定义属性
【发布时间】:2020-06-18 07:01:13
【问题描述】:

我需要根据主题更改小部件的color。我有单独的ThemeData 用于明暗主题。现在是否可以向ThemeData 添加自定义属性,以便我可以根据主题更改小部件的颜色并使用该自定义属性?

【问题讨论】:

    标签: flutter dart themes


    【解决方案1】:

    遗憾的是,you simply can't - 考虑到他们的建议,Flutter 团队似乎没有兴趣添加它。

    我认为这是一个重大缺陷,因为我们无法从 Theme.of(context) 自动更新所有使用此 ThemeDataWidget

    虽然有些人可能会说您可以使用扩展来添加新属性,但您实际上不知道如何区分多个 ThemeData(除非您可以使用像 Brightness 这样的属性,但我认为这也是hacky,这样做不可靠)。

    另一种方法是创建另一个InheritedWidget(就像他们在上面提到的问题中所说的那样)来处理您的自定义主题属性。

    编辑:似乎new PR 引入了扩展ThemeData 的可能性,但它还没有登陆 main 甚至还没有稳定。

    【讨论】:

    • 使用扩展功能我想我无法获得动态主题。
    • 其实我们可以使用extension,并且可以有动态主题。我已经添加了答案。
    • 你看过我的回复了吗?您所做的只是基于Brightness 之类的属性在多个ThemeData 之间进行区分。尽管如此,我还是对您的回答添加了更深入的回应。
    【解决方案2】:

    我们可以通过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),
                            ),
    

    【讨论】:

    • 不,你不能。假设您有 10 个不同的 ThemeData。你会如何区分它们?只需使用Brightness?您所做的只是针对特定情况的一种解决方法,即人们只有 2 个不同的主题,它们的“亮度”不同。
    猜你喜欢
    • 1970-01-01
    • 2012-07-10
    • 2023-03-06
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2017-11-07
    • 2021-11-16
    • 2020-07-02
    相关资源
    最近更新 更多