Cra*_*rds 6 flutter flutter-layout
我正在努力解决如何RichText处理包含其他RichText实例的嵌套跨度。只要用户不更改手机的默认字体大小,它就可以正常工作。但是如果他们改变了显示字体大小,事情就会开始出错。
考虑我正在解析一些看起来像这样的 HTML 的情况:
<underline><italic><bold>xxxxx</bold></italic></underline>
Run Code Online (Sandbox Code Playgroud)
这个概念可以模拟成一个TextSpan内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);
}
}
Run Code Online (Sandbox Code Playgroud)
正如您在左侧看到的那样,它在正常字体大小下看起来很棒,但在右侧,RichText当您调整手机的字体大小时,这三种情况都不会缩放。
不过这很容易解释……因为 a 的默认缩放因子RichText是1.0没有缩放的。让我们通过将创建代码更改为如下所示来解决这个问题:
return RichText(text: span, textScaleFactor: MediaQuery.of(context).textScaleFactor);
Run Code Online (Sandbox Code Playgroud)
正如你在下面看到的,普通字体看起来仍然不错,但是哇...由于RichText嵌套,事情真的很快扩大(我假设它正在将比例因子应用于已经缩放的孩子)。
现在,我发现的一件事是,如果我允许RichText使用 的比例因子创建所有小部件1.0,然后将最外层包装在RichText使用设备比例因子的 a 中,它/几乎/可以工作。例如,删除缩放_buildStyledElement并将此行添加到主Column小部件中:
RichText(text: WidgetSpan(child: boldItalisedUnderlined), textScaleFactor: MediaQuery.of(context).textScaleFactor),
Run Code Online (Sandbox Code Playgroud)
如您所见,正常字体大小看起来不错,实际上缩放到大字体的正确大小。然而,包装现在已经破了。
我假设这是因为在使用媒体查询的比例因子时,由子RichText小部件计算的大小(因为它们使用的比例因子为1.0)与总计算空间不匹配。
Sooo...我想我的问题是是否有办法真正让它与嵌套RichText实例一起正常工作。我知道对于这个特定的例子,可能还有其他一些选择……但我说的是RichText小部件嵌入其他RichText小部件的一般情况。
任何想法将不胜感激。抱歉,帖子太长了。
小智 3
不管没有明确的解决方案,我发现有一个对我的目的特别有用的解决方法:
您需要将 Html Widget 的文本比例因子固定为 1,并为 HTML 上的平均文本选择默认字体大小,并将其乘以屏幕的当前比例因子(不是手动固定的)。
class ExampleWidget extends StatelessWidget {
final String data;
ExampleWidget({this.data});
@override
Widget build(BuildContext context) {
double scaleFactor = MediaQuery.of(context).textScaleFactor;
int standardFontSize = 14;
int h3FontSize = 18;
return MediaQuery(
data: MediaQueryData(textScaleFactor: 1),
child: Html(
data: data,
style: {
'body': Style(fontSize: FontSize(standardFontSize * scaleFactor)),
'h3': Style(fontSize: FontSize(h3FontSize * scaleFactor))
// other header fonts...
},
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
缺点是每次需要新的字体大小时都需要手动实现,但这可能会解决紧急问题。
| 归档时间: |
|
| 查看次数: |
527 次 |
| 最近记录: |