Flutter中如何手动调用FocusNode的监听函数?
正确实现方式:提取复用逻辑函数
你原来的问题在于,调用fn1.notifyListeners()只是让所有绑定在fn1上的监听函数执行一遍,但fn1的hasFocus状态并没有改变,所以监听里的if (!fn1.hasFocus)条件不会触发,自然不会执行setState。
正确的做法是把监听里的逻辑抽成一个独立的可复用函数,这样不管是fn1的状态变化,还是nameController的变化,都能直接调用这个函数:
- 先定义独立的逻辑方法:
void _updateDescriptionSuffixVisibility() { if (!fn1.hasFocus) { setState(() { _descriptionFieldShowSuffix = false; }); } }
- 在fn1的监听里调用这个方法:
fn1.addListener(_updateDescriptionSuffixVisibility);
- 在nameController的监听里直接调用这个方法:
nameController!.addListener(() { _updateDescriptionSuffixVisibility(); });
如果需要在nameController变化时,不管fn1是否有焦点都强制隐藏后缀,直接修改_updateDescriptionSuffixVisibility的逻辑即可,比如去掉if (!fn1.hasFocus)判断。核心思路就是把可复用的状态更新逻辑抽离出来,避免依赖FocusNode的监听触发机制。
内容的提问来源于stack exchange,提问作者Nikolay Michurin
相关产品推荐
相关产品推荐

