فهرست منبع

fix: 解决红米设备上Cordova插件异步初始化问题,实现准备检查功能 (v1.14.2 -> v1.14.3)

- 在CordovaStorageAdapter中添加异步插件初始化逻辑
- 实现initializePlugin方法处理deviceready事件
- 添加ensureReady方法确保插件准备好后再执行操作
- 在所有存储操作前调用await this.ensureReady()
- 解决红米设备上出现的问题,在雷电模拟器上没有这个问题

改动文件:
- src/features/serverConfig/storage/CordovaStorageAdapter.ts
dengdx 3 هفته پیش
والد
کامیت
35b73ca464
3فایلهای تغییر یافته به همراه77 افزوده شده و 4 حذف شده
  1. 21 0
      CHANGELOG.md
  2. 1 1
      package.json
  3. 55 3
      src/features/serverConfig/storage/CordovaStorageAdapter.ts

+ 21 - 0
CHANGELOG.md

@@ -2,6 +2,27 @@
 
 本项目的所有重要变更都将记录在此文件中。
 
+## [1.14.3] - 2025-12-19 18:17
+
+### 修复 (Fixed)
+- **Cordova插件异步初始化和准备检查功能** ([src/features/serverConfig/storage/CordovaStorageAdapter.ts](src/features/serverConfig/storage/CordovaStorageAdapter.ts))
+  - 在CordovaStorageAdapter中添加异步插件初始化逻辑
+  - 实现initializePlugin方法处理deviceready事件
+  - 添加ensureReady方法确保插件准备好后再执行操作
+  - 在所有存储操作前调用await this.ensureReady()
+
+**核心改进:**
+- 异步初始化:确保Cordova插件在deviceready后初始化
+- 错误处理:添加超时机制和错误日志
+- 性能优化:避免插件未准备好时的操作失败
+
+**改动文件:**
+- src/features/serverConfig/storage/CordovaStorageAdapter.ts
+- CHANGELOG.md
+- package.json (版本更新: 1.14.2 -> 1.14.3)
+
+---
+
 ## [1.14.2] - 2025-12-19 18:05
 
 ### 新增 (Added)

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "zsis",
-  "version": "1.14.2",
+  "version": "1.14.3",
   "private": true,
   "description": "医学成像系统",
   "main": "main.js",

+ 55 - 3
src/features/serverConfig/storage/CordovaStorageAdapter.ts

@@ -6,17 +6,67 @@ import { IStorageAdapter } from './IStorageAdapter';
  */
 export class CordovaStorageAdapter implements IStorageAdapter {
   private NativeStorage: any;
+  private isReady = false;
+  private readyPromise: Promise<void> | null = null;
 
   constructor() {
+    this.initializePlugin();
+  }
+
+  private initializePlugin() {
+    // 先尝试获取插件
     // @ts-ignore
     this.NativeStorage = window.NativeStorage;
-    
-    if (!this.NativeStorage) {
-      throw new Error('NativeStorage plugin not available');
+
+    if (this.NativeStorage) {
+      this.isReady = true;
+    } else {
+      // 如果插件还没加载,监听 deviceready 事件
+      document.addEventListener('deviceready', () => {
+        // @ts-ignore
+        this.NativeStorage = window.NativeStorage;
+        this.isReady = !!this.NativeStorage;
+
+        if (!this.isReady) {
+          console.warn('NativeStorage plugin still not available after deviceready');
+        }
+      }, false);
     }
   }
 
+  private async ensureReady(): Promise<void> {
+    if (this.isReady) {
+      return;
+    }
+
+    // 如果还没准备好,创建一个等待 Promise
+    if (!this.readyPromise) {
+      this.readyPromise = new Promise((resolve, reject) => {
+        const checkReady = () => {
+          if (this.isReady) {
+            resolve();
+          } else {
+            // 每100ms检查一次,最多等待10秒
+            setTimeout(checkReady, 100);
+          }
+        };
+
+        // 10秒超时
+        setTimeout(() => {
+          if (!this.isReady) {
+            reject(new Error('NativeStorage plugin initialization timeout'));
+          }
+        }, 10000);
+
+        checkReady();
+      });
+    }
+
+    return this.readyPromise;
+  }
+
   async getItem(key: string): Promise<string | null> {
+    await this.ensureReady();
     return new Promise((resolve) => {
       this.NativeStorage.getItem(
         key,
@@ -30,6 +80,7 @@ export class CordovaStorageAdapter implements IStorageAdapter {
   }
 
   async setItem(key: string, value: string): Promise<void> {
+    await this.ensureReady();
     return new Promise((resolve, reject) => {
       this.NativeStorage.setItem(
         key,
@@ -44,6 +95,7 @@ export class CordovaStorageAdapter implements IStorageAdapter {
   }
 
   async removeItem(key: string): Promise<void> {
+    await this.ensureReady();
     return new Promise((resolve, reject) => {
       this.NativeStorage.remove(
         key,