为什么文本小部件不采用主题中定义的样式?
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
属性.
的默认值
当我写下面的代码时,我希望文本是红色的:
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
属性.