onChangeText method
void
onChangeText(
- 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");
}
}
}