Flutter中TextEditingController监听被多次触发问题求助
嘿,我懂你遇到的这个糟心问题!其实你完全没必要用TextEditingController的监听器来实现点击跳转的需求,这反而会导致从新页面返回时,因为Controller的状态被恢复而触发不必要的监听回调。咱们换个更直接、更靠谱的方式:
最优解决方案:用TextField的
onTap回调替代Controller监听器 你想要的效果是用户点击TextField时跳转到选点页面,这刚好是TextField自带的onTap属性的设计场景!用它来实现的话,既简单又能完美避免返回时触发的问题,代码修改起来也超轻松:
修改后的Screen 1代码
class SubmitPost extends StatefulWidget{ @override _submitPostState createState() => new _submitPostState(); } class _submitPostState extends State<SubmitPost>{ final originTextController = TextEditingController(); @override void dispose() { // 记得清理Controller originTextController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return TextField( controller: originTextController, // 这里就是用户点击TextField时触发的回调 onTap: () { Navigator.push(context, MaterialPageRoute(builder: (context) => PlacePicker())); }, // 你的其他TextField配置(比如hintText、decoration等) ); } }
这样改完之后,只有用户主动点击TextField的时候才会跳转到PlacePicker页面,从新页面返回时绝对不会再出现监听器莫名触发的情况,完全符合你的需求!
如果你确实需要用Controller监听器(不推荐)
如果因为某些特殊业务场景,你必须依赖TextEditingController的监听器,那我们可以通过过滤触发原因来避免不必要的跳转。比如,我们可以记录上一次的文本内容,只有当文本真正发生变化时才执行跳转;或者检查TextField的焦点状态,确保是用户主动交互触发的:
示例:通过文本变化过滤触发
class _submitPostState extends State<SubmitPost>{ final originTextController = TextEditingController(); String _previousText = ""; @override void initState() { super.initState(); _previousText = originTextController.text; originTextController.addListener(_onOriginTouch); } void _onOriginTouch() { // 只有当文本真正改变时才执行跳转逻辑 if (originTextController.text != _previousText) { _previousText = originTextController.text; Navigator.push(context, MaterialPageRoute(builder: (context) => PlacePicker())); } } @override void dispose() { originTextController.removeListener(_onOriginTouch); originTextController.dispose(); super.dispose(); } }
不过还是要再强调一遍:第一种用onTap的方式才是最贴合你需求的方案,因为你本来就是要响应用户的点击操作,而不是文本内容的变化~
内容的提问来源于stack exchange,提问作者Brett Young
相关产品推荐
相关产品推荐

