小程序开发中ios和安卓问题

一、 onUnload 不能再调用 editorCtx.getContents

项目场景:

笔记页面使用富文本,在笔记中记载后返回时,要提示新建笔记成功toast


问题描述

安卓可以提示toast,但是ios不行。

js 复制代码
  async onUnload() {
    try {
      await this.checkAndHandleEmptyNote();
    } catch (error) {
      console.error('onUnload error:', error);
    }

    if (this.debounceTimer) {
      clearTimeout(this.debounceTimer);
    }
  },
    async checkAndHandleEmptyNote() {
     // 获取当前editor中的纯文本内容
    let textContent = '';
    if (this.editorCtx) {
      try {
        textContent = await new Promise((resolve) => {
          this.editorCtx.getContents({
            success: (res) => {
              resolve(res.text || TextUtils.htmlToText(res.html || ''));
            },
            fail: () => {
              resolve(TextUtils.htmlToText(this.data.content));
            }
          });
        });
      } catch (error) {
        textContent = TextUtils.htmlToText(this.data.content);
      }
    } else {
      textContent = TextUtils.htmlToText(this.data.content);
    }
    const isEmpty = !this.data.title.trim() && !textContent.trim();
    if (this.data.delete) {
      this.refreshNoteListPage();
      return;
    }
    if (isEmpty && this.data.isNewNote && this.data.id != '0') {
      this.deleteEmptyNoteDirectly();
    } else if (this.data.isContentModified) {
      // 有内容的笔记,先同步到服务器,然后刷新列表
      if (this.data.isNewNote) {
        wx.showToast({
          title: '笔记创建成功',
          icon: 'none'
        })
      }
      this.syncToServer().then(() => {
        this.refreshNoteListPage();
      });
    }
  },

原因分析:

刚开始以为是因为iOS 小程序在 onUnload 中调用 wx.showToast 不生效,但是通过调试后发现,isEmpty并没有输出. --> 执行流程被中断了,中断点只可能在editorCtx.getContents 这行。

onUnload 调用这一段,iOS 会直接中断 editorCtx 的任何异步操作。
包括 getContents,不会执行 success 或 fail → Promise 不 resolve → 函数永远卡住

富文本编辑器 editorCtx 异步 API 在 onUnload 内不可靠,尤其 iOS 会直接不执行。


解决方案:

进入 onUnload 前,把 editor 内容保存到 data。

js 复制代码
onContentInput(e) {
  let plainText = e.detail.text;
  this.data.latestText = plainText; // <-- 新增缓存
}

async checkAndHandleEmptyNote() {
  const text = this.data.latestText || '';

  const isEmpty = !this.data.title.trim() && !text.trim();
  console.log('isEmpty', isEmpty);
  
  ...
}
相关推荐
执明wa4 小时前
Android 开发中的设计模式入门:六大设计原则
android·设计模式
阿祖zu17 小时前
芝士就是力量!开源私有化部署与 GitHub 双向同步的个人知识笔记 App
前端·后端·ios
松仔log17 小时前
Java中级——组合和继承
android·java·开发语言
我命由我1234520 小时前
Jetpack Compose - MaterialExpressiveTheme 与 MaterialTheme、ColorScheme
android·java·开发语言·java-ee·kotlin·android jetpack·android runtime
lilian23321 小时前
Harmony os 技术实战|拼豆制图06:收藏 ID、生成记录与重启恢复怎么不打架
android·java·数据库·harmonyos
2601_9557596221 小时前
ClaudeAPI成本中心与业务标签设计指南
android·java·数据库
余衫马1 天前
2026最新版!Android Studio 极速安装与配置指南
android·ide·android studio
AFinalStone1 天前
Android 7系统异常问题排查(五)Framework层(下)—System Server崩溃
android·tombstone·系统异常
AFinalStone1 天前
Android 7系统异常问题排查(八)系统追踪—Trace机制与性能诊断
android·系统异常
GitLqr1 天前
iOS 27 强制要求 UISceneDelegate:UIKit 和 Flutter 开发者该如何应对?
flutter·ios·全栈