uni-app 从A页码打开B页面再返回A且通过获取A的实例A页面函数出现异常

发布于 1周前 作者 h691938207 来自 Uni-App

uni-app 从A页码打开B页面再返回A且通过获取A的实例A页面函数出现异常

信息类别 详情
产品分类 uniapp/App
PC开发环境 Windows
PC版本号 win11
HBuilderX 正式版
HBuilderX版本 3.8.12
手机系统 Android
手机版本号 Android 9.0
手机厂商 小米
手机机型 mix 2
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

操作步骤:

代码请参数BUG说明的附件

预期结果:

正常不闪退

实际结果:

发生异常并闪退

bug描述:

从A打开B,在B页面通过获取到A的实例并调用A的函数后发生成异常(实现现在麻烦请看附件) 通过android studio logcat的异常如下:

FATAL EXCEPTION: Timer-2
Process: cn.com.enjoyit.EnjoyMobile, PID: 20020
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:8031)
at android.view.ViewRootImpl.requestChildFocus(ViewRootImpl.java:3878)
at android.view.ViewGroup.requestChildFocus(ViewGroup.java:819)
...


3 回复

我也遇到相同的类型,请问解决了吗


抽出你的逻辑,提供一个最小的可复现的 demo

uni-app 中,如果你从 A 页面打开 B 页面,然后从 B 页面返回到 A 页面,并希望通过获取 A 页面的实例来调用 A 页面的函数时出现异常,可能是因为页面实例的获取方式不正确或页面生命周期的问题。以下是一些可能的原因和解决方案:

1. 使用 getCurrentPages() 获取页面实例

uni-app 提供了 getCurrentPages() 方法,可以获取当前页面栈中的页面实例。你可以通过这个方法获取到 A 页面的实例,然后调用其方法。

// 在B页面返回到A页面时调用
onBack() {
  const pages = getCurrentPages();
  const prevPage = pages[pages.length - 2]; // 获取A页面的实例
  if (prevPage && prevPage.yourFunctionName) {
    prevPage.yourFunctionName(); // 调用A页面的方法
  }
  uni.navigateBack(); // 返回A页面
}

2. 确保 A 页面的函数存在

A 页面中,确保你尝试调用的函数已经定义,并且是 A 页面的实例方法。

// A页面
export default {
  methods: {
    yourFunctionName() {
      console.log('Function in A page is called');
      // 你的逻辑
    }
  }
}

3. 页面生命周期问题

uni-app 中,页面的生命周期可能会影响函数的调用。例如,如果 A 页面在 onHideonUnload 时被销毁,那么你无法再调用其方法。

确保在 B 页面返回到 A 页面时,A 页面仍然处于活动状态。

4. 使用 EventBus 或全局事件通信

如果你需要在页面之间进行通信,可以考虑使用 EventBus 或全局事件通信机制。

// 在A页面监听事件
uni.$on('eventName', (data) => {
  console.log('Event received in A page:', data);
  this.yourFunctionName();
});

// 在B页面触发事件
uni.$emit('eventName', { message: 'Hello from B page' });

5. 使用 Vuex 进行状态管理

如果你需要在页面之间共享状态或触发某些操作,可以考虑使用 Vuex 进行全局状态管理。

// 在Vuex中定义状态和操作
const store = new Vuex.Store({
  state: {
    shouldCallFunction: false
  },
  mutations: {
    setShouldCallFunction(state, value) {
      state.shouldCallFunction = value;
    }
  }
});

// 在A页面监听Vuex状态变化
computed: {
  shouldCallFunction() {
    return this.$store.state.shouldCallFunction;
  }
},
watch: {
  shouldCallFunction(newVal) {
    if (newVal) {
      this.yourFunctionName();
      this.$store.commit('setShouldCallFunction', false);
    }
  }
}

// 在B页面修改Vuex状态
this.$store.commit('setShouldCallFunction', true);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!