我希望特定Text
中的每个Widget
都具有白色,尽管它们的大小都可以不同。我知道我可以将每个Text
的颜色更改为白色,但是我想使其变得聪明,并为该特定Widget
更改主题。
我尝试过:
DefaultTextStyle.merge(
style: TextStyle(color: Colors.white),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('Text 1',
style: Theme.of(context).textTheme.title,
),
Text('Text 2')
],
),
),
问题是Text 1
变成了黑色,而Text 2
是白色了。
我认为使用DefaultTextStyle.merge
仍然可以使用Theme.of(context)
来获得通用TextTheme
,仍然保持对DefaultTextStyle
的更改,但是显然我错了。
在能够访问原始Theme
其余部分的同时,更改子树的文本颜色的正确方法是什么?
答案 0 :(得分:2)
这里的问题是,您正在使用此style
覆盖style: Theme.of(context).textTheme.title
,它会从您当前title
的{{1}}中获得textTheme
样式您的应用。
可能的解决方案是使用自定义样式,但复制color属性,如下所示:
Theme
简单的方法就是不使用DefaultTextStyle(
style: TextStyle(color: Colors.white),
child: Builder(
builder: (context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Text 1',
style: Theme.of(context).textTheme.title.copyWith(
color: DefaultTextStyle.of(context).style.color),
),
Text('Text 2')
],
);
},
),
),
中的textTheme
,而无需指定颜色即可编写自己的样式,如下所示:
Theme
更新
我找到了另一种可以使用的方式:
DefaultTextStyle(
style: TextStyle(color: Colors.white),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Text 1',
//change the style without changing the color
style: TextStyle(fontSize: 40),
),
Text('Text 2')
],
),
),
如果您不想使用Theme(
data: Theme.of(context).copyWith(
textTheme: Theme.of(context).textTheme.apply(
bodyColor: Colors.white,
displayColor: Colors.white,
),
),
child: DefaultTextStyle(
style: TextStyle(color: Colors.white),
child: Builder(
builder: (context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Text 1',
style: Theme.of(context).textTheme.title,
),
Text('Text 2')
],
);
},
),
),
),
小部件,请在父小部件(您的statelesswidget / statefulwidget的)上使用Builder
。