为什么文本小部件不采用主题中定义的样式?

Why a Text widget is not taking the style defined in the theme?

当我写下面的代码时,我希望文本是红色的:

Theme(
  data: Theme.of(context).copyWith(
    textTheme: Theme.of(context).textTheme.copyWith(
      bodyText2: TextStyle(color: Colors.red),
    ),
    buttonTheme: Theme.of(context)
        .buttonTheme
        .copyWith(buttonColor: Colors.yellow),
  ),
  child: Builder(
    builder: (context) {
      return Column(
        children: [
          Text('Flutter'),
          Text('is awesome!'),
          RaisedButton(
            onPressed: () {},
            child: Text('OK'),
          )
        ],
      );
    },
  ),
)

但是如您所见,文本是黑色的而按钮是黄色的: here

如您所见,Text 小部件忽略了主题中定义的样式,而 RaisedButton 则没有。为什么?

我知道我可以使用 DefaultTextStyle,但我想了解为什么它没有像我预期的那样工作。

Text 小部件有 style 属性。从docs可以看出:

If the [style] argument is null, the text will use the style from the
closest enclosing [DefaultTextStyle].

很明显,如果您没有像您那样指定它,文本将使用来自 DefaultTextStyle 小部件(而不是来自 Theme)的样式。如果你想使用主题中的样式,你应该明确指定它:

 Text('Flutter', style: Theme.of(context).textTheme.bodyText2)

至于按钮 - 任何 MaterialButton 子项(也包括 RaisedButton)使用 ButtonTheme.of(context).textTheme 作为 textTheme 属性.

的默认值