onChangeText method

void onChangeText(
  1. String changeText
)

Implementation

void onChangeText(String changeText) {
  var isJsSetValue = _isJsSetValue(changeText);
  if (validator.isEmpty) {
    //如果没有正则匹配
    //如果文本输入过,判断是否两次相同
    if (_hasTextInput && _oldText == changeText) {
      return;
    }
    _oldText = changeText;
    _jsSetValue = "";
    _hasTextInput = true;
    if (!isJsSetValue) {
      //如果是前端设置下来的值,不再需要回调给前端.
      var paramsMap = VoltronMap();
      paramsMap.push("text", changeText);
      context.renderBridgeManager.sendComponentEvent(
        rootId,
        id,
        TextInputController.kEventOnChangeText,
        paramsMap,
      );
      LogUtils.d(
        TextInputController.kTag,
        "afterTextChanged 1 通知前端文本变化=$changeText",
      );
    }
  } else {
    //如果设置了正则表达式
    try {
      //如果当前的内容不匹配正则表达式
      if (!RegExp(validator).hasMatch(changeText) && changeText != "") {
        LogUtils.d(
          TextInputController.kTag,
          "afterTextChanged 不符合正则表达式,需要设置回去=$changeText",
        );
        //丢弃当前的内容,回退到上一次的值.上一次的值检查过,肯定是符合正则表达式的.
        controller.value = TextEditingValue(
          text: _oldText,
          selection: TextSelection.collapsed(
            offset: _oldText.length,
          ),
        );
        //上一步的setText,将触发新一轮的beforeTextChanged,onTextChanged,afterTextChanged
        //为了避免前端收到两次内容同样的通知.记录一下正则匹配设置回去的值.
        _regexValidRepeat = _oldText;
        _hasTextInput = true;
      } else {
        //如果文本输入过,判断是否两次相同
        if (_hasTextInput && changeText == _oldText) {
          return;
        }
        _hasTextInput = true;
        _oldText = changeText;
        _jsSetValue = "";
        if (!isJsSetValue //如果是前端设置的一定不通知
            &&
            (isEmpty(_regexValidRepeat) //如果没有,输入过无效的内容
                ||
                _oldText != _regexValidRepeat)) {
          //如果本次输入的内容是上一次重复的蓉蓉
          var paramsMap = VoltronMap();
          paramsMap.push("text", changeText);
          context.renderBridgeManager.sendComponentEvent(
            rootId,
            id,
            TextInputController.kEventOnChangeText,
            paramsMap,
          );
          LogUtils.d(
            TextInputController.kTag,
            "afterTextChanged 2 通知前端文本变化= $changeText",
          );
          _regexValidRepeat = "";
        }
      }
    } catch (error) {
      // 不知道外部的正则表达式,最好保护住
      LogUtils.e(TextInputController.kTag, "change text error:$error");
    }
  }
}