访问在线网页时需添加网络权限:ohos.permission.INTERNET,具体申请方式请参考声明权限。
当复用同一个WebviewController,Web组件切换到不可见状态时,通过loadUrl加载新的网页后再切换到可见状态,会出现上一个页面的残留帧。
问题效果预览:


该问题主要由于Web组件在不可见到可见状态切换时,存在之前Web页面的残留帧导致的。可参考以下方案解决:
Web组件所在页面代码逻辑示例:
- import { webview } from '@kit.ArkWeb';
- import { emitter } from '@kit.BasicServicesKit';
- import { PromptAction } from '@kit.ArkUI';
-
- @Entry
- @Component
- struct WebPages {
- @State selectedIndex: number = 0;
- @State currentIndex: number = 0;
- private controller: TabsController = new TabsController();
-
- @Builder
- tabBuilder(title: string, targetIndex: number) {
- Column() {
- Text(title).fontColor(this.selectedIndex === targetIndex ? '#0a59f7' : '#6B6B6B');
- }.width('100%')
- .height(50)
- .justifyContent(FlexAlign.Center);
- }
-
- build() {
- Column() {
- Tabs({ barPosition: BarPosition.End, index: this.currentIndex, controller: this.controller }) {
- TabContent() {
- TabOne();
- }.tabBar(this.tabBuilder('Tab', 0));
-
- TabContent() {
- TabTwo();
- }.tabBar(this.tabBuilder('Tab', 1));
- }
- .vertical(false)
- .barMode(BarMode.Fixed)
- .barWidth(360)
- .barHeight(60)
- .animationDuration(0)
- .onChange((index: number) => {
- this.currentIndex = index;
- this.selectedIndex = index;
- })
- .width('100%')
- .height('100%');
- };
- }
- }
-
- @Component
- export struct TabOne {
- @State webviewController: webview.WebviewController = new webview.WebviewController();
- // 用户标识
- @StorageProp('userInfo') userInfo: string = '';
- // 监听用户登录及退出操作
- @StorageProp('isLogged') @Watch('isLoggedChange') isLogged: boolean = false;
- loadNewUrl: () => void = () => {
- // 通过loadUrl加载网页前,将Web组件设置为onActive状态
- this.webviewController.onActive();
- // 此处地址实际使用过程中替换为三个不同的真实地址
- if (this.userInfo === '1') {
- this.webviewController.loadUrl('xx.xx.xx');
- } else if (this.userInfo === '2') {
- this.webviewController.loadUrl('xx.xx.xx');
- } else {
- this.webviewController.loadUrl('xx.xx.xx');
- }
- };
-
- aboutToAppear(): void {
- // 订阅网页加载事件,其它Tab页面会通知加载网页
- emitter.on('loadUrl', this.loadNewUrl);
- }
-
- isLoggedChange() {
- if (!this.isLogged) {
- // 当用户退出时,将Web组件设置为onActive状态后加载空URL
- this.webviewController.onActive();
- this.webviewController.loadUrl('about:blank');
- }
- }
-
- aboutToDisappear(): void {
- emitter.off('loadUrl');
- }
-
- getSrc() {
- // 此处地址实际使用过程中替换为三个不同的真实地址
- let src = 'xx.xx.xx';
- if (this.userInfo === '1') {
- src = 'xx.xx.xx';
- } else if (this.userInfo === '2') {
- src = 'xx.xx.xx';
- }
- return src;
- }
-
- build() {
- Web({
- src: this.getSrc(),
- controller: this.webviewController
- })
- .onPageEnd((event) => {
- // Web组件在后台时若一直保持onActive状态,可能会对功耗有影响。此处判断加载的URL,当加载空URL完成时将Web组件设置回onInactive状态
- if (event.url == 'about:blank') {
- this.webviewController.onInactive();
- }
- })
- .geolocationAccess(false)
- .fileAccess(true)
- .domStorageAccess(true);
- }
- }
-
- @Component
- export struct TabTwo {
- @StorageProp('userInfo') userInfo: string = '';
- @StorageProp('isLogged') isLogged: boolean = false;
- promptAction: PromptAction = this.getUIContext().getPromptAction();
-
- build() {
- Column({ space: 20 }) {
-
- Text(`当前登录状态:${this.isLogged ? '已登录' : '未登录'}`);
- Text(`当前用户:${this.userInfo}`);
-
- // 模拟用户登录退出操作
- Button('登录用户1 网页1')
- .onClick(() => {
- AppStorage.setOrCreate('isLogged', true);
- AppStorage.setOrCreate('userInfo', '1');
- emitter.emit('loadUrl');
- this.promptAction.showToast({
- message: '用户1 登录成功'
- });
- });
- Button('登录用户2 网页2')
- .onClick(() => {
- AppStorage.setOrCreate('isLogged', true);
- AppStorage.setOrCreate('userInfo', '2');
- emitter.emit('loadUrl');
- this.promptAction.showToast({
- message: '用户2 登录成功'
- });
- });
- Button('退出登录')
- .onClick(() => {
- AppStorage.setOrCreate('isLogged', false);
- AppStorage.setOrCreate('userInfo', '');
- this.promptAction.showToast({
- message: '退出登录成功'
- });
- });
- };
- }
- }
访问在线网页时需添加网络权限:ohos.permission.INTERNET,具体申请方式请参考声明权限。
合作咨询
我们的专家服务团队将竭诚为您提供专业的合作咨询服务
解决方案
精准高效的一站式服务支持,助力开发者商业成功