触发屏幕监听时调用MobX Store中所有Dio请求的问题求助
排查TextField触发屏幕监听时所有Dio请求被调用的问题
以下是几个可能的成因及对应的排查方向:
- 全局布局变化监听的误触发:检查是否实现了
WidgetsBindingObserver并监听了didChangeMetrics方法——TextField获取焦点时会触发屏幕布局(比如软键盘弹出)变化,若该回调里不小心写了触发所有Dio请求的逻辑,就会出现这个问题。 - Dio拦截器的异常逻辑:查看自定义的Dio拦截器,比如
onRequest或其他拦截方法中是否存在错误的条件判断,导致只要有事件触发就批量执行请求;或者拦截器被错误地全局绑定,引发连锁调用。 - 状态组件的意外重建:即便你排查过Observable Widget,还是要检查
FutureBuilder、StreamBuilder这类组件——如果它们的数据源绑定到了全局请求的Future/Stream,当TextField触发屏幕重绘时,这些组件会重建并重新执行请求。 - MobX全局状态的隐式触发:哪怕没初始化目标MobX类,也要确认是否有全局MobX store被其他模块初始化,或者存在跨组件的状态监听,比如某个全局action被屏幕布局变化事件触发,进而调用所有Dio请求。
- MediaQuery变化的监听逻辑:软键盘弹出/收起会触发
MediaQuery的变化,如果有组件监听MediaQuery.of(context)的变化并在回调中执行请求,就会导致问题。建议在所有Dio请求入口添加日志,打印StackTrace.current,追踪请求的触发栈。
实用排查步骤:
- 在每个Dio请求的调用处添加日志,输出调用栈,精准定位触发源。
- 临时注释TextField相关代码,验证问题是否消失,再逐步恢复代码缩小排查范围。
- 检查
WidgetsBinding.instance.addObserver的注册位置,确认回调逻辑是否存在触发请求的可能。
内容的提问来源于stack exchange,提问作者Sultan SARIBAŞ
相关产品推荐
相关产品推荐

