You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter技术问题:如何在同一段落中使用多种字体?

实现Flutter混合语言文本的动态字体切换

要处理API返回的混合语言文本(如英文+孟加拉语),并为不同语言段落设置对应字体,你需要用RichText组件替代普通Text,通过拆分文本片段并分别指定样式来实现。以下是具体步骤和代码:

1. 判断字符所属语言

先写一个辅助函数,通过Unicode范围识别字符是否属于孟加拉语:

bool isBengali(String char) {
  final int codeUnit = char.codeUnitAt(0);
  // 孟加拉语Unicode区间:U+0980 至 U+09FF
  return codeUnit >= 0x0980 && codeUnit <= 0x09FF;
}

2. 拆分文本为同语言片段

将API返回的原始文本分割成连续的英文或孟加拉语片段:

List<String> splitTextByLanguage(String text) {
  final List<String> segments = [];
  if (text.isEmpty) return segments;

  String currentSegment = text[0];
  bool currentIsBengali = isBengali(text[0]);

  for (int i = 1; i < text.length; i++) {
    final char = text[i];
    final isCharBengali = isBengali(char);

    if (isCharBengali == currentIsBengali) {
      currentSegment += char;
    } else {
      segments.add(currentSegment);
      currentSegment = char;
      currentIsBengali = isCharBengali;
    }
  }
  segments.add(currentSegment);
  return segments;
}

3. 用RichText渲染多字体文本

将拆分后的片段对应设置字体,组合成TextSpan后传入RichText:

RichText(
  text: TextSpan(
    children: splitTextByLanguage(apiText).map((segment) {
      final isBengaliSeg = isBengali(segment[0]);
      return TextSpan(
        text: segment,
        style: TextStyle(
          fontFamily: isBengaliSeg ? 'NotoSansBengali' : 'Roboto',
          fontSize: 16,
          color: Colors.black,
        ),
      );
    }).toList(),
  ),
)

4. 字体文件配置

记得在pubspec.yaml中导入对应的字体文件:

flutter:
  fonts:
    - family: Roboto
      fonts:
        - asset: fonts/Roboto-Regular.ttf
    - family: NotoSansBengali
      fonts:
        - asset: fonts/NotoSansBengali-Regular.ttf

说明

  • 代码会自动识别文本中的连续语言片段,为孟加拉语片段指定对应字体,英文片段使用Roboto。
  • 若需支持更多语言,只需扩展isBengali函数的判断逻辑,增加对应语言的Unicode区间即可。

内容的提问来源于stack exchange,提问作者Abir Ahsan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:50:58