SwiftUI如何实现TextField失去焦点时触发指定函数?
类Web onBlur效果的TextField失焦触发方案
现有onEditingChange(输入内容变更时触发)、onCommit(提交输入时触发)两个回调都无法匹配「仅失去焦点时触发」的需求,可根据使用的技术栈选择对应无侵入实现方案:
1. Jetpack Compose 实现
通过FocusRequester搭配onFocusChanged修饰符实现,逻辑完全封装在TextField内部,不会干扰其他视图事件:
@Composable fun BlurDetectTextField() { var inputText by remember { mutableStateOf("") } val focusRequester = remember { FocusRequester() } // 记录上一次焦点状态,避免组件初始化时误触发 var previousHasFocus by remember { mutableStateOf(false) } TextField( value = inputText, onValueChange = { inputText = it }, modifier = Modifier .focusRequester(focusRequester) .onFocusChanged { currentState -> // 仅在焦点从有变为无的时候触发校验 if (previousHasFocus && !currentState.hasFocus) { // 执行自定义校验逻辑 validateInput(inputText) } previousHasFocus = currentState.hasFocus }, // 原有配置项(onCommit、placeholder等)不需要修改 ) }
2. Flutter 实现
通过FocusNode监听焦点变更实现,注意页面销毁时释放节点避免内存泄漏:
class BlurDetectTextFieldState extends State<BlurDetectTextField> { final FocusNode _textFieldFocusNode = FocusNode(); String _inputText = ""; @override void initState() { super.initState(); _textFieldFocusNode.addListener(() { // 失去焦点时触发校验 if (!_textFieldFocusNode.hasFocus) { _validateInput(_inputText); } }); } @override void dispose() { _textFieldFocusNode.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return TextField( focusNode: _textFieldFocusNode, onChanged: (value) => _inputText = value, // 原有配置项不需要修改 ); } }
以上两种方案均不会对页面其他视图造成额外事件干扰,触发时机和Web端
onblur事件完全对齐。
内容的提问来源于stack exchange,提问作者SalsaJJ
相关产品推荐
相关产品推荐

