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

Flutter/Dart特定Unicode字符颜色修改异常问题求助

Flutter中为特定Unicode字符设置颜色时出现字符重复、颜色扩散问题

我是Flutter新手,想要实现给字符串中特定Unicode字符设置颜色:将\u0951设为蓝色、\u0952设为红色、\u1cda设为绿色,但输出不符合预期,出现字符重复、颜色应用到相邻字符的问题,需要兼容Android和iOS平台。

此前用Kotlin开发Android应用时,通过SpannableString实现类似功能一切正常,但当前用Dart编写的Flutter代码出现问题,代码如下:

import 'package:flutter/material.dart';
import 'package:flutter/painting.dart';
import 'package:google_fonts/google_fonts.dart';

class TextModifierScreen extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    return TextModifierScreenState();
  }
}

class TextModifierScreenState extends State{

  List<TextSpan> _displaySpans = [];
  String inputString = "मृ॒त्यवे॒ यो॑ स्वाहा᳚ भू॒ मु॒भयो॒रा ॥";

  void replaceVowelsWithColor(String input) {
    List<TextSpan> spans = [];
    for (int i = 0; i < input.length; i++) {
      String char = input[i];
      int unicode = char.codeUnitAt(0);
      String unicodeString = '\\u${unicode.toRadixString(16).padLeft(4, '0')}';
      print('Unicode of $char is $unicodeString');
      if(char == '\\u0952'){
        spans.add(TextSpan(
          text: char,
          style: TextStyle(color: Colors.red, ),
        ));
      }else if(char == '\\u0951'){
        spans.add(TextSpan(
          text: char,
          style: TextStyle(color: Colors.blue),
        ));
      }else if(char == '\\u1cda'){
        spans.add(TextSpan(
          text: char,
          style: TextStyle(color: Colors.green),
        ));
      }else{
        spans.add(TextSpan(
            text: char,
          style: TextStyle(color: Colors.black),
        ));
      }
    }
    setState(() {
      _displaySpans = spans;
    });
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Accents Color Replacer'),
      ),
      body: Center(
        child: Padding(
          padding: EdgeInsets.only(left: 20, right: 20),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RichText(
              text: TextSpan(
                style: GoogleFonts.tiroDevanagariSanskrit(
                  fontSize: 20,
                  color: Colors.black,
                ),
                children: <TextSpan>[
                  TextSpan(text: 'Original Text:\n '),
                  TextSpan(text: inputString),
                ],
              ),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                replaceVowelsWithColor(inputString);
              },
              child: Text('Replace colors'),
            ),
            SizedBox(height: 20),
            RichText(
              text: TextSpan(
                style: GoogleFonts.tiroDevanagariSanskrit(
                  fontSize: 20,
                  color: Colors.black,
                ),
                children: <TextSpan>[
                  TextSpan(text: 'Modifed Text: \n'),
                  ..._displaySpans,
                  //_displaySpans[0],_displaySpans[2],_displaySpans[9],_displaySpans[2]
                ],
              ),
            ),
          ],
        ),
      ),
      ),
    );
  }
}

效果说明

  • 实际效果:字符出现重复,目标颜色错误地应用到了相邻字符上
  • 预期效果:仅目标Unicode字符(\u0951、\u0952、\u1cda)分别显示为蓝色、红色、绿色,其余字符正常显示,无重复问题

更新内容

将代码修改为给英文元音字符设色时功能正常,对应代码如下:

void replaceVowelsWithColor(String input) {

    List<TextSpan> spans = [];
    for (int i = 0; i < input.length; i++) {
      String char = input[i];
      int unicode = char.codeUnitAt(0);
      String unicodeString = '\\u${unicode.toRadixString(16).padLeft(4, '0')}';
      print('Unicode of $char is $unicodeString');
      if(char == '\\u0061'){
        spans.add(TextSpan(
          text: char,
          style: TextStyle(color: Colors.red, ),
        ));
      }else if(char == '\\u0065'){
        spans.add(TextSpan(
          text: char,
          style: TextStyle(color: Colors.blue),
        ));
      }else if(char == '\\u0069'){
        spans.add(TextSpan(
          text: char,
          style: TextStyle(color: Colors.green),
        ));
      }else if(char == '\\u006F'){
        spans.add(TextSpan(
          text: char,
          style: TextStyle(color: Colors.yellow),
        ));
      }else if(char == '\\u0075'){
        spans.add(TextSpan(
          text: char,
          style: TextStyle(color: Colors.pink),
          ));
      }else{
        spans.add(TextSpan(
          text: char,
          style: TextStyle(color: Colors.black),
        ));
      }
    }
    setState(() {
      _displayEngSpans = spans;
    });
  }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:29:50