makecindy / makecindy/cindy

bug: 安卓左滑任务打开菜单后点击「删除任务」无响应

Open
#4,461 1 comment 0 reactions 0 assignees View on GitHub
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.