GestureDetector的onTap事件中无法调用MyApp类怎么解决?
问题原因及解决方案
你遇到的失效问题通常由两类原因导致,对应处理方式如下:
- 点击区域未命中导致onTap不触发
GestureDetector默认仅响应子组件实际渲染覆盖区域的点击事件,若Row仅包裹内容、未撑满父布局,点击Row的空白区域不会触发回调。
修复方案二选一即可:- 给GestureDetector添加
behavior: HitTestBehavior.opaque配置,让组件的全部占位区域都响应点击事件 - 给Row添加
mainAxisSize: MainAxisSize.max配置,让Row撑满父布局主轴空间
- 给GestureDetector添加
- MyApp实例调用错误导致无预期输出
如果在onTap中直接用MyApp()新建实例调用方法,生成的是全新的MyApp对象,和当前运行的应用实例不是同一个,自然无法拿到当前的entry值、也不会产生预期的打印效果。
修复方案:获取当前正在运行的MyApp实例再调用方法,可选方案如下:- 全局声明一个变量存储MyApp的运行实例,在onTap中直接调用该实例的打印方法
- 若MyApp是当前Widget树的上层节点,可通过
context.findAncestorWidgetOfExactType<MyApp>()获取当前树中的MyApp实例,再调用打印方法 - 通过Provider、GetX等状态管理工具共享entry值或者MyApp实例的引用
// 修复后的示例代码 GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { // 示例:通过上下文获取当前MyApp实例调用方法 MyApp? currentApp = context.findAncestorWidgetOfExactType<MyApp>(); currentApp?.printEntry(); }, child: Row( mainAxisSize: MainAxisSize.max, children: [ // 你的原有Row子组件 ], ) )
内容的提问来源于stack exchange,提问作者soroush nikpour
相关产品推荐
相关产品推荐

