flutter-tap-outside-dismiss
スター12
フォーク2
更新日2026年5月31日 10:06
Flutter 外域点击关闭浮层的实现方式。在需要实现"点击外部区域关闭侧栏/弹出面板"交互时激活,确保使用正确的组件和模式。
インストール
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SKILL.md
readonlyメニュー
Flutter 外域点击关闭浮层的实现方式。在需要实现"点击外部区域关闭侧栏/弹出面板"交互时激活,确保使用正确的组件和模式。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
GitHub Release 发布操作规范。在需要发布版本、上传安装包到 GitHub Release 时激活,确保使用正确的命令和流程。
确认/删除等交互弹框统一使用 showTolyPopPicker 底部弹出样式。在需要弹出确认框、删除确认、操作选择时激活,确保交互风格一致。
后端服务启动与数据库操作规范。在需要启动后端服务、运行 API 测试、执行数据库迁移或遇到连接错误时激活,确保使用正确的命令和流程。
功能归档规范。在归档功能版本、更新功能网、创建存档快照时激活,确保节点编号正确、网络图完整。
使用 tolyui_mediax 实现媒体预览。适用于图片九宫格展示、全屏预览、手势缩放、视频播放、Hero 动画等场景。
Flutter Widget/Page 组件代码评审技能。在需要审查组件代码质量、发现设计问题时激活,确保输出结构化的问题清单和改进建议。
| name | flutter-tap-outside-dismiss |
| description | Flutter 外域点击关闭浮层的实现方式。在需要实现"点击外部区域关闭侧栏/弹出面板"交互时激活,确保使用正确的组件和模式。 |
| metadata | {"model":"manual","last_modified":"Sat, 30 May 2026 00:00:00 GMT"} |
需要实现"点击浮层外部区域自动关闭/收起浮层"的交互,常见于:
Flutter 内置的 TapRegion 组件,无需第三方依赖。它能检测"点击发生在自身区域之外"的事件。
TapRegion(
onTapOutside: (_) => _dismiss(),
child: MyFloatingPanel(),
)
TapRegion 注册一个"区域",当用户点击屏幕上不属于该区域的位置时,触发 onTapOutsideTapRegion 可以通过 groupId 分组,同组内的点击不算"外部"当浮层内部有子浮层(如弹窗中的下拉菜单)时,用 groupId 避免误关闭:
TapRegion(
groupId: 'my-panel',
onTapOutside: (_) => _dismiss(),
child: Column(
children: [
MyPanel(),
TapRegion(
groupId: 'my-panel', // 同组,点击这里不会触发外层的 onTapOutside
child: SubMenu(),
),
],
),
)
// 侧栏浮层套 TapRegion,点击聊天区(外部)时收起
Positioned(
top: kToolbarHeight + 0.5,
bottom: 0,
right: 0,
width: 320,
child: SlideTransition(
position: _slideAnimation,
child: TapRegion(
onTapOutside: _isVisible ? (_) => _dismiss() : null,
child: Container(
decoration: const BoxDecoration(
color: Colors.white,
border: Border(
left: BorderSide(color: Color(0xFFE0E0E0), width: 0.5),
),
),
child: _buildSidebarContent(),
),
),
),
)
关键点:
onTapOutside 设为条件回调:只在浮层可见时响应,避免动画收起过程中重复触发| 方案 | 优点 | 缺点 |
|---|---|---|
TapRegion | 内置、简洁、不需要遮罩层 | Flutter 3.10+ 才有 |
GestureDetector 遮罩 | 兼容性好 | 需要额外的全屏透明层,可能拦截其他手势 |
FocusNode + onFocusChange | 适合输入框场景 | 不适合通用浮层 |
Listener 全局监听 | 最灵活 | 需要手动判断点击位置,代码复杂 |
TapRegion 要求 Flutter 3.10+(Dart 3.0+)onTapOutside 的参数是 PointerDownEvent,可以获取点击位置TextField,它自带 TapRegion 行为(点击外部失焦),注意不要冲突onTapOutside: null,避免动画过程中重复触发