Flutter RTL语言(如波斯语)下TextFormField光标定位异常问题
Flutter RTL语言下TextFormField光标跳转问题解决办法
使用波斯语等RTL语言时,TextFormField内将光标移至文本末尾(位置n),光标会自动跳转到末尾前一位(n-1),现有公开方案无效时可尝试以下方案:
自定义TextEditingController处理光标
创建专属控制器,重写光标设置逻辑,强制RTL文本光标定位到真正的末尾:
class RTLTextEditingController extends TextEditingController { @override set selection(TextSelection newSelection) { final text = this.text; if (text.isNotEmpty && newSelection.baseOffset == text.length) { super.selection = TextSelection.collapsed(offset: text.length); } else { super.selection = newSelection; } } }
在TextFormField中使用该控制器:
TextFormField( controller: RTLTextEditingController(), textDirection: TextDirection.rtl, // 其他配置项 )
监听文本变化手动修正光标
若上述方案无效,可通过监听控制器状态,手动修正光标位置:
final TextEditingController _controller = TextEditingController(); @override void initState() { super.initState(); _controller.addListener(() { final text = _controller.text; final selection = _controller.selection; if (text.isNotEmpty && selection.baseOffset == text.length - 1 && selection.isCollapsed) { _controller.selection = TextSelection.collapsed(offset: text.length); } }); } // 组件构建代码 TextFormField( controller: _controller, textDirection: TextDirection.rtl, )
升级Flutter版本
部分老版本Flutter对RTL文本的光标处理存在原生bug,建议升级至最新稳定版(如3.10及以上),多数RTL相关问题已在新版本中修复。
内容的提问来源于stack exchange,提问作者Salar
相关产品推荐
相关产品推荐

