我在处理 RichText
如何处理包含其他RichText
实例的嵌套跨度。只要用户不更改手机的默认字体大小,它就可以正常工作。但是如果他们已经更改了显示字体大小,事情就开始出错了。
考虑这样一个情况,我正在解析一些类似于HTML的内容:
<underline><italic><bold>xxxxx</bold></italic></underline>
从概念上讲,这可以建模为一个TextSpan
内部包含另一个TextSpan
,因此我可能会有一些人为的代码,看起来像:
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final inputText = 'The quick brown fox jumped over the lazy dog. The quick brown fox jumped over the lazy dog.';
final initialSpan = TextSpan(text: inputText, style: TextStyle(color: Colors.black));
final boldText = _buildStyledElement(context, initialSpan, Style.bold);
final boldItalised = _buildStyledElement(context, WidgetSpan(child: boldText), Style.italic);
final boldItalisedUnderlined = _buildStyledElement(context, WidgetSpan(child: boldItalised), Style.underline);
return new Scaffold(
appBar: AppBar(title: Text('')),
body: Column(
children: [
Text(inputText), // a simple baseline to compare
boldText,
boldItalised,
boldItalisedUnderlined,
],
),
);
}
RichText _buildStyledElement(BuildContext context, InlineSpan span, Style style) {
// note we're not applying the style because it isn't important... the style parameter
// is just a means of wrapping our heads around a real-world example of nesting
return RichText(text: span);
}
}
如您所见,左侧的文本字体大小看起来很好,但右侧三个RichText
用于调整手机字体大小时无法缩放。
这很容易解释...因为RichText
的默认缩放因子是1.0
,所以没有缩放。让我们通过更改创建代码来修复它:
return RichText(text: span, textScaleFactor: MediaQuery.of(context).textScaleFactor);
正如你在下面看到的,普通字体看起来仍然不错,但是哇...由于RichText
嵌套(我假设它将比例因子应用于已经缩放的子元素),事情会迅速扩大。
现在,我发现的一件事是,如果我允许所有的RichText
小部件使用1.0
的比例因子创建,然后用设备的比例因子包装最外层的RichText
,它几乎可以工作。例如,从_buildStyledElement
中删除缩放并将此行添加到主Column
小部件中:
RichText(text: WidgetSpan(child: boldItalisedUnderlined), textScaleFactor: MediaQuery.of(context).textScaleFactor),
正常字体看起来很好,而且可以实际缩放到正确的大字体大小。然而,现在换行已经破裂了。
我认为这是因为子RichText
小部件计算的大小(因为它们使用1.0
的比例因子)与使用媒体查询的比例因子计算的总空间不匹配。
所以...我的问题是是否有一种方法可以通过嵌套的RichText
实例使其正常工作。我知道对于这个特定的例子可能有其他选项...但我谈论的是RichText
小部件嵌入其他RichText
小部件的一般情况。
非常感谢您提出任何想法。抱歉我的帖子很长。