發(fā)現(xiàn)問(wèn)題
新版本引入了一個(gè)新勛章,測(cè)試走查其多語(yǔ)言時(shí)發(fā)現(xiàn),泰文版勛章名沒(méi)有一行展示而是換行了,如圖所示:

因?yàn)槠渌Z(yǔ)言沒(méi)問(wèn)題、泰文版其他勛章名也是正常的,所以第一反應(yīng)是有問(wèn)題的泰文是不是誤加了換行符?經(jīng)查并沒(méi)有。而且在限制勛章名Text組件最多展示一行且按照末尾打點(diǎn)后,原本換到第二行的內(nèi)容也被打點(diǎn)掉了:

這時(shí)嘗試給Text一個(gè)最大寬度,沒(méi)有任何變化:
return ConstrainedBox(
constraints: BoxConstraints(maxWidth: 150),
child: Text(...),
)
接著嘗試給Text一個(gè)固定寬度,此時(shí)終于能正常一行展示了:
return Container(
width: 150,
child: Text(...),
);
但這不符合設(shè)計(jì),Text后面緊挨著一個(gè)小問(wèn)號(hào),要求Text是自適應(yīng)寬度的,因此要給Text一個(gè)實(shí)際寬度才行,但僅算出來(lái)的寬度還不行,要多加一點(diǎn)寬度才可以:
final painter = TextPainter(
textDirection: TextDirection.ltr,
maxLines: 1,
text: TextSpan(
text: ...,
style: ...,
),
);
painter.layout(minWidth: 0, maxWidth: 150);
return Container(
width: painter.width + 2, // 2就是額外寬度
child: Text(...),
);
最終效果如圖:

定位原因
本以為這個(gè)問(wèn)題算是解決了,在自測(cè)時(shí)突然發(fā)現(xiàn)好幾處都有類似問(wèn)題,比如這個(gè)頁(yè)面圈出來(lái)的幾處泰文,如果限制了最大行數(shù)會(huì)表現(xiàn)為提前打點(diǎn)、未限制時(shí)會(huì)表現(xiàn)為莫名換行,且只有泰文有問(wèn)題:

這些泰文的相同點(diǎn)是最后一個(gè)字符都包含
-?,為驗(yàn)證的確是該符號(hào)引起,做了如下測(cè)試:
那是否只有
-?符號(hào)會(huì)導(dǎo)致錯(cuò)誤呢?wiki-泰文字一文了解在泰文共包含這些字母:
其中,紅框圈出的被稱為組合符號(hào)(Combining Character),即可以加在前一個(gè)字母之上:

經(jīng)過(guò)測(cè)試,這16個(gè)組合符號(hào)中有4個(gè)會(huì)導(dǎo)致顯示異常(前四個(gè)):

其實(shí)也不難猜到,因?yàn)檫@4個(gè)符號(hào)明顯超出底部輔音字母寬度,且超出部分能在后一個(gè)輔音字母的空間中顯示。因此,如果它們不在最后一個(gè),實(shí)際寬度就等于測(cè)量寬度(輔音字母寬度之和);如果處于最后一個(gè),實(shí)際寬度就大于測(cè)量寬度,導(dǎo)致?lián)Q行或打點(diǎn)。
解決辦法
這里提供幾種解決思路:
1、直接修改翻譯,或在文本后加一個(gè)空格即可,可以快速修復(fù)線上問(wèn)題
2、優(yōu)化Text組件,兼容泰文這幾個(gè)特殊符號(hào)處于最后一個(gè)的情況
3、設(shè)置字體,如Google提供的這一款泰文字體 Google Fonts-Noto Serif Thai 可以調(diào)整組合字符的顯示區(qū)域,使之不超出輔音字母。

總結(jié)
突然發(fā)現(xiàn)最近三篇BUG系列都是多語(yǔ)言問(wèn)題,在解決問(wèn)題過(guò)程中也學(xué)習(xí)各個(gè)地區(qū)語(yǔ)言的與眾不同,也是很有意思的經(jīng)歷了~