uni-app getCurrentPages()函数在鸿蒙next真机上存在兼容问题,获取到的是个空数组

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

uni-app getCurrentPages()函数在鸿蒙next真机上存在兼容问题,获取到的是个空数组

示例代码:

const height = systemInfo.value.windowWidth; // 定义动态的高度变量  
const statusbarHeight = systemInfo.value.statusBarHeight; // 动态状态栏高度  
const pages = getCurrentPages();  
const page: any = pages[pages.length - 1];  
const currentWebview = page.$getAppWebview();  
setTimeout(() => {  
       const wv = currentWebview.children()[0];  
            wv.setStyle({  
                top: statusbarHeight + 44,  
                height: height - statusbarHeight - 136,  
            });  
}, 200);

操作步骤:

在webview中加载一个pdf文件,调用以上代码去动态修改webview页面高度,为导航栏和底部按钮腾出位置的操作就可以复现问题了。

预期结果:

希望getCurrentPages函数以及内置子函数功能与ios和安卓端保持一致

实际结果:

getCurrentPages在鸿蒙next上不兼容

bug描述:

代码如上,通过getCurrentPages()在鸿蒙next真机上获取当前页面栈实例获取到的数据跟安卓(ios)是存在差异的,返回的不是页面栈数组,导致webview页面中无法调用$getAppWebview()去动态修改webview页面的top和height属性

Image 1

Image 2

Image 3


| 信息类别         | 信息内容                                                   |
|------------------|------------------------------------------------------------|
| 产品分类         | uniapp/App                                                 |
| PC开发环境       | Windows                                                    |
| PC开发环境版本号 | 版本:Windows 10 专业版;版本号:21H2;操作系统内部版本号:19044.3086 |
| 手机系统         | HarmonyOS NEXT                                             |
| 手机系统版本号   | HarmonyOS NEXT Developer Beta2                             |
| 手机厂商         | 华为                                                       |
| 手机机型         | HUAWEI Mate 60(软件版本:NEXT.0.0.71(SP6C00E71R4P17patch02)) |
| 页面类型         | vue                                                        |
| vue版本          | vue3                                                       |
| 打包方式         | 云端                                                       |
| 项目创建方式     | CLI                                                        |
| CLI版本号        | 4.29                                                       |
| nvue编译模式     | fast                                                       |

更多关于uni-app getCurrentPages()函数在鸿蒙next真机上存在兼容问题,获取到的是个空数组的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

这个需求能用webview组件实现吗?目前没有计划支持$getAppWebview

更多关于uni-app getCurrentPages()函数在鸿蒙next真机上存在兼容问题,获取到的是个空数组的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


求解决求解决!!!!

针对您提到的uni-app中getCurrentPages()函数在鸿蒙next真机上存在兼容问题,获取到的是个空数组的情况,这确实是一个比较棘手的问题,因为getCurrentPages()是uni-app框架提供的一个API,用于获取当前页面栈的实例数组,这在多页面跳转和状态管理中非常有用。不过,由于不同平台的差异,确实可能出现兼容性问题。

在无法直接修改uni-app框架源码或等待官方修复的情况下,我们可以通过一些替代方案或者工作区来绕过这个问题。以下是一个可能的解决方案,它使用了Vuex(或类似的状态管理库)来手动管理页面栈,而不是依赖getCurrentPages()

使用Vuex管理页面栈

首先,确保您的项目中已经安装了Vuex。然后,在store中定义一个模块来管理页面栈。

// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    pagesStack: []
  },
  mutations: {
    PUSH_PAGE(state, page) {
      state.pagesStack.push(page);
    },
    POP_PAGE(state) {
      state.pagesStack.pop();
    }
  },
  actions: {
    pushPage({ commit }, page) {
      commit('PUSH_PAGE', page);
    },
    popPage({ commit }) {
      commit('POP_PAGE');
    }
  }
});

在页面组件中使用Vuex管理页面栈

在每个页面的onShowonHide(或beforeDestroy)生命周期钩子中,调用Vuex的action来更新页面栈。

// 在每个页面的script部分
export default {
  onShow() {
    this.$store.dispatch('pushPage', this);
  },
  onHide() {
    this.$store.dispatch('popPage');
  }
};

注意事项

  1. 性能考虑:手动管理页面栈可能会增加一些额外的开销,尤其是在页面切换频繁的应用中。
  2. 页面引用:确保在pushPagepopPage中传递的是页面的正确引用,以便后续可以通过页面栈访问到这些页面实例。
  3. 平台差异:虽然这种方法可以在一定程度上绕过getCurrentPages()的兼容性问题,但仍然需要注意其他平台差异。

通过上述方法,我们可以在不依赖getCurrentPages()的情况下,手动维护一个页面栈,从而在鸿蒙next真机上实现类似的功能。

回到顶部