uni-app 从A页码打开B页面再返回A且通过获取A的实例A页面函数出现异常
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
页面在 onHide
或 onUnload
时被销毁,那么你无法再调用其方法。
确保在 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);