Flutter 苹果原生拼音键盘在TextField上输入异常 | 拼音输入过程回调问题

Flutter 正常文本回调通过onChange 处理, 也可以通过 监听TextEditingController 处理

监听TextEditingController

在这里插入图片描述

通过value.composing来判断,第一个判断是直接输入的,那就直接返回一个普通样式。第二个判断就是有输入未完成字符的,**value.composing.textInside(value.text)**获取到的就是输入未完成的字符,默认是添加了一个下划线的样式,类似苹果原生输入里面一个灰黑色的背景一样,这样就可以直接实现和原生中文键盘输入一样的效果。

所以 直接继承 TextEditingController 重写这个富文本方法即可处理

class ChangeTextEditingController extends TextEditingController {
  var completeText = '';

	// 有使用到其他方法可以直接添加到这里继承 使用 
  ChangeTextEditingController.fromValue(TextEditingValue value)
      : super.fromValue(value);

  @override
  TextSpan buildTextSpan(
      {BuildContext context, TextStyle style, bool withComposing}) {
    ///拼音输入完成
    if (!value.composing.isValid || !withComposing) {
      if (completeText != value.text) {
        completeText = value.text;
        WidgetsBinding.instance.addPostFrameCallback((_) {
          notifyListeners();
        });
      }
      return TextSpan(style: style, text: text);
    }

    ///返回输入样式,可自定义样式
    final TextStyle composingStyle = style.merge(
      const TextStyle(decoration: TextDecoration.underline),
    );
    return TextSpan(style: style, children: <TextSpan>[
      TextSpan(text: value.composing.textBefore(value.text)),
      TextSpan(
        style: composingStyle,
        text: value.composing.isValid && !value.composing.isCollapsed
            ? value.composing.textInside(value.text)
            : "",
      ),
      TextSpan(text: value.composing.textAfter(value.text)),
    ]);
  }
}

应用 : 在初始化页面或者是视图 initState 添加

// 初始化属性
  String lastInput = "";
  ChangeTextEditingController controller;

  @override
  void initState() {
    super.initState();

    controller = ChangeTextEditingController.fromValue(
      TextEditingValue(
        text: widget.defaultContent,
        selection: TextSelection.fromPosition(
          TextPosition(
              affinity: TextAffinity.downstream,
              offset: widget.defaultContent.length),
        ),
      ),
    );

    controller.addListener(() {
      if (lastInput != controller.completeText) {
        lastInput = controller.completeText;

        ///通知onChanged 回调。
        _onChange(controller.completeText);
      }
    });
  }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值