2.1.2 DefaultTextStyle
实战中,经常会对不止一个Text组件配置其样式风格,而2.1.1节介绍Text组件及相关的文本样式配置时也提到,Text组件的默认样式是由上级DefaultTextStyle(默认文本样式)继承而来,因此,当多个Text组件需要统一风格时,与其单独设置这些Text组件的参数,还不如在Text组件的上级插入一个DefaultTextStyle组件,直接通过修改默认样式,统一多个下级Text组件。
1.基础参数与用法
DefaultTextStyle组件的参数和Text组件非常相似,例如style属性可以借助TextStyle类型自定义字体、字号、粗细、颜色、渲染特效等,textAlign属性可以设置文本对齐方式,maxLines和overflow等可以规定最大行数及溢出部分的处理方式等。对此不熟悉的读者可以参考2.1.1节Text组件中相关内容的介绍和代码示例。
与Text组件不同的是,DefaultTextStyle不支持直接传入文本内容(Text组件那个必传的位置参数),而是支持child参数,可供传入一个任意组件。这里借助部分容器组件,如Column或Stack等,就可以间接传入多个Text组件作为DefaultTextStyle的下级,使它们同时继承DefaultTextStyle组件设置的默认文本样式。
例如可设置DefaultTextStyle的参数使默认样式成为灰色(默认为白色)、粗体、居中对齐,再通过传入一个Column容器,使4个子级Text组件统一继承这种样式,代码如下:
运行效果如图2-13所示。
图2-13 默认样式与单独设置的样式合并
上例中,第3个Text组件额外单独传入了style参数,将文本样式设置为黑色且斜体。它的style参数的值会与上级DefaultTextStyle组件提供的默认样式合并,因此默认的灰色会被这里的黑色覆盖,默认的粗体与这里的斜体不冲突(前者为fontWeight属性,后者为fontStyle属性),因此合并后会同时使用,显示效果为既粗又斜。
2.合并与继承
Text组件的默认样式是由最临近的上级DefaultTextStyle组件所提供的,因此当遇到多个DefaultTextStyle组件嵌套时,只有最近的那个样式会生效。换言之,每个DefaultTextStyle组件都可以当作一个文本样式的全新起点,不仅确定了它的下级Text组件的默认样式,还同时切断了它们与更上级的DefaultTextStyle的联系。
若需要新的DefaultTextStyle组件继承上级已有的默认样式,则可以借助DefaultTextStyle.merge()构造函数进行合并操作,而不是重新开始。
例如,这里先使用定义父级样式的DefaultTextStyle组件,再定义2个子级样式,其中第1个不使用合并,第2个使用合并,代码如下:
图2-14 默认样式与父级样式合并
运行时,由于Column容器中的第1个DefaultTextStyle组件没有使用合并,因此父级组件定义的所有文本样式全部丢失,只使用这里定义的黑色斜体字(默认字号为14号),而第2个组件使用了DefaultTextStyle.merge()合并构造函数,致使父级组件中的加粗和24号字效果得以保留,但父级定义的灰色仍然被这里定义的黑色所覆盖,再叠加上斜体,最终运行效果如图2-14所示。
3.动画效果
若需要在程序运行时做出文本样式的渐变动画效果,如文本颜色渐渐由红到蓝的转变,或者字体大小的渐变等,则可考虑使用该组件的动画版:AnimatedDefaultTextStyle组件。调用时只需额外传入动画时长(如300ms),Flutter就会自动根据传入的样式改变,渲染出不同动画。有兴趣的读者可参考第7章“过渡动画”中关于AnimatedDefaultTextStyle组件的介绍。