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
相关产品推荐
相关产品推荐

