fix: 修复 Android 闪退问题 - SecureStore 异步调用

问题:
- NativeStorage 使用了同步方法调用 expo-secure-store
- expo-secure-store 的正确 API 是异步的(getItemAsync/setItemAsync/deleteItemAsync)
- 在 Android 上同步调用不存在的方法导致应用崩溃

修复:
- 将 Storage 接口改为异步方法
- 使用 SecureStore.getItemAsync/setItemAsync/deleteItemAsync
- removeItem 使用 deleteItemAsync 而不是设置空字符串

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
imeepos
2025-11-12 14:44:42 +08:00
parent 3ebcc24e9b
commit 67f3c0b70e
10 changed files with 101 additions and 89 deletions

View File

@@ -87,6 +87,7 @@ export default function TemplateDetailScreen() {
const [menuVisible, setMenuVisible] = useState(false);
const [loadingLooks, setLoadingLooks] = useState(true);
const [errorMessage, setErrorMessage] = useState<string | null>(null);
const [retryTrigger, setRetryTrigger] = useState(0);
const abortControllerRef = useRef<AbortController | null>(null);
const imageCache = useRef(new Set<string>());
@@ -242,22 +243,15 @@ export default function TemplateDetailScreen() {
cache.delete(`tag:${current?.title}`);
setErrorMessage(null);
setLoadingLooks(true);
const event = new Event('retry');
window.dispatchEvent(event);
setRetryTrigger(prev => prev + 1);
}, [id, current?.title]);
useEffect(() => {
const handleRetryEvent = () => {
if (retryTrigger > 0) {
const newController = new AbortController();
abortControllerRef.current = newController;
};
window.addEventListener('retry', handleRetryEvent);
return () => {
window.removeEventListener('retry', handleRetryEvent);
};
}, []);
}
}, [retryTrigger]);
const handleGenerate = () => {
if (!resolvedTemplateId) {