bug: 安卓左滑任务打开菜单后点击「删除任务」无响应
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 395
- Avg merge
- 21h 48m
- Merged PRs (30d)
- 776
Description
### 问题描述 / What happened
初步根因分析
高概率是 Android 自绘操作菜单的关闭回调没有可靠触发,导致删除动作一直滞留在 pending 状态。
相关链路:
useSessionListActions.ts:129 点击菜单后立即把菜单设为关闭状态;
useSessionListActions.ts:136 将删除动作保存到 pendingSheetActionRef;
真正的 Alert.alert(...) 只会在 handleSessionSheetClosed 回调中执行,见 useSessionListActions.ts:142 和 useSessionListActions.ts:115;
Android 菜单的 onClosed 依赖动画完成回调 setMounted(false),见 SessionActionSheet.tsx:107;
onClosed 通过 mounted 状态变化触发,见 SessionActionSheet.tsx:114-120。
也就是说,点击删除后的实际流程是:
点击删除
→ visible = false
→ 等待关闭动画完成
→ mounted = false
→ onClosed()
→ 才弹出 Alert.alert()
如果 Android 上动画被中断、Modal 生命周期异常、组件卸载或回调未执行,删除确认弹窗就不会出现,pending action 也不会被消费,表现正是「删除没有反应」。
日志证据
日志中可以看到 Android Modal 生命周期:
10:18:46.283:创建 ReactModalHostView
10:18:51.339:销毁 ReactModalHostView
对应日志行:
E:\logfile_mi10_0915.txt:11477
E:\logfile_mi10_0915.txt:11494
但该时间段没有看到删除确认后的删除请求或删除失败提示。
日志中另有 device-link 断连:
E:\logfile_mi10_0915.txt:10838
E:\logfile_mi10_0915.txt:18558
E:\logfile_mi10_0915.txt:18908
这可能影响删除 RPC,但如果已经进入删除请求,代码应通过 runSwipeAction(...).catch(...) 弹出失败提示。因此当前现象更像是确认弹窗根本没有被触发,而不是单纯 RPC 失败。
可能的回归来源
该逻辑在提交 f46baf515(2026-08-29)中改为:
删除与重命名一样,必须等待 Sheet 关闭后再弹系统对话框。
这次改动同时影响了 Android 路径,但现有回归测试主要覆盖 iOS Sheet,未覆盖 Android Modal 的关闭动画和 onClosed 生命周期。
修复建议
建议优先调整 Android 删除流程:
Android 点击「删除」时,确保 onClosed 一定能触发;
给关闭动画增加取消、超时或卸载兜底;
不要只依赖 Animated.timing(...).start() 的 finished 回调;
增加 Android 专项测试,覆盖:
点击删除;
菜单开始关闭;
关闭动画完成;
确认弹窗出现;
点击确认后调用 local-db:sessions:patch-meta;
关闭动画被中断时仍能正确收口。
建议补充的核心断言:
Android 点击删除
→ SessionActionSheet visible=false
→ onClosed 必须执行一次
→ Alert.alert 必须执行一次
→ 点击确认后 delete patch 必须发出
### 环境 / Environment
设备:Xiaomi Mi 10
Android:10
MIUI:V12.0.8.0.QJBCNXM
包名:com.xd.cindycn
日志:E:\logfile_mi10_0915.txt
复现日期:2026-09-15
OTA:36c6a567-9ee0-4176-b7ca-a572dac9ccfb
### 复现步骤 / Steps to reproduce
打开 Cindy Android 客户端。
在任务列表中左滑一个任务。
点击菜单。
点击「删除任务」。
观察页面行为。
### 日志与截图 / Logs & screenshots
https://github.com/user-attachments/assets/3dab43ab-d81d-425b-bbc7-0b7639cee387
Contributor guide
Research direction
Start in useSessionListActions.ts around lines 115, 129, 136, and 142, then inspect SessionActionSheet.tsx around lines 107 and 114-120. Trace Android deletion from the menu action through visible=false, onClosed, Alert.alert, and the delete patch request. Add regression coverage for interrupted closing and verify onClosed and Alert.alert run once before local-db:sessions:patch-meta is called.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- react-native, typescript
- Domain
- mobile-dev
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 68/100