全局Loading弹窗简易版(UI问题优化):通过window.createWindow()来实现(HarmonyOS 鸿蒙Next共享包依赖版)

发布于 1周前 作者 itying888 来自 鸿蒙OS

全局Loading弹窗简易版(UI问题优化):通过window.createWindow()来实现(HarmonyOS 鸿蒙Next共享包依赖版)
<markdown _ngcontent-wdr-c237="" class="markdownPreContainer">

0.写在前面

如果在创建弹窗后在极短时间内关闭,或者短时间内频繁创建弹窗都可能导致UI显示问题,所以这里采用显示、隐藏回调方式实现。

1.创建共享包(如loadingLib,本示例在项目根目录下创建)

2.在loadingLib共享包中创建加载要显示的Page页面(LoadingPage.ets)

  • 为LoadingPage指定路由名称,即:[@Entry](/user/Entry)({ routeName: 'LoadingPage' })
[@Entry](/user/Entry)({ routeName: 'LoadingPage' })
[@Component](/user/Component)
export struct LoadingPage {
  [@StorageProp](/user/StorageProp)('loading_message') message: string = '请稍候'

build() { Stack({ alignContent: Alignment.Center }) { Column() { LoadingProgress().width(30).height(30).color(Color.White)

    Text(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.message ?? <span class="hljs-string"><span class="hljs-string">'请稍候'</span></span>)
      .fontColor(Color.White)
      .fontSize(<span class="hljs-number"><span class="hljs-number">16</span></span>)
      .margin({ <span class="hljs-attribute"><span class="hljs-attribute">top</span></span>: <span class="hljs-number"><span class="hljs-number">15</span></span> })
      .width(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>)
      .textAlign(TextAlign.Center)
  }
  .justifyContent(FlexAlign.Center)
  .width(<span class="hljs-number"><span class="hljs-number">100</span></span>)
  .height(<span class="hljs-number"><span class="hljs-number">100</span></span>)
  .backgroundColor(<span class="hljs-string"><span class="hljs-string">'#88000000'</span></span>)
  .borderRadius(<span class="hljs-number"><span class="hljs-number">8</span></span>)
}
.width(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>)
.height(<span class="hljs-string"><span class="hljs-string">'100%'</span></span>)
.backgroundColor(Color.Transparent)

} } <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

3.WindowUtils类用于创建窗口并导出:

  • 在loadingLib共享包默认生成的Index.ets中导出WindowUtils类:
    export { WindowUtils } from "./src/main/ets/utils/WindowUtils"
    <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
  • 记得导入LoadingPage.ets:
    import 'loadingLib/src/main/ets/pages/LoadingPage'
    <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
  • WindowUtils.ets
import { display, window } from '@kit.ArkUI';
import 'lib/src/main/ets/pages/LoadingPage.ets';

export class WindowUtils { private static loadingWindow: window.Window | null = null

/**

  • @param message 提示信息
  • @param pagePath 自定义Loading页面路径 */ static showLoading(doNext?: () => void, message: ResourceStr = ‘请稍候’, pagePath: string = ‘’) { let context = getContext() window.createWindow({ name: ‘loading_window’, windowType: window.WindowType.TYPE_DIALOG, ctx: context }).then(async win => { WindowUtils.loadingWindow = win if (typeof (message) != ‘string’) { message = context.resourceManager.getStringSync(message) ?? ‘请稍候’ } AppStorage.setOrCreate(‘loading_message’, message) if (pagePath == ‘’) { await win.loadContentByName(“LoadingPage”) } else { await win.setUIContent(pagePath) } win.setWindowBackgroundColor(’#88000000’) let d = display.getDefaultDisplaySync() await win.resize(d.width, d.height) await win.setWindowFocusable(true) win.showWindow().then(() => { if (doNext) { doNext() } }) }) }

static hideLoading(doNext?: () => void) { if (WindowUtils.loadingWindow) { WindowUtils.loadingWindow.destroyWindow().then(() => { if (doNext) { doNext() } WindowUtils.loadingWindow = null }) } else { if (doNext) { doNext() } } } } <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

4.在需要使用loadingLib共享包的module(如entry)中oh-package.json5添加依赖:

{
  "name": "entry",
  ...
  "dependencies": {
    ...
    "loadingLib": "file:../loadingLib"
  }
}
<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>

5.在Page或组件中使用:

  • 显示Loading:
    WindowUtils.showLoading(() => {
    // 在弹窗显示后执行下一步操作
    })
    <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
  • 隐藏Loading
    WindowUtils.hideLoading(() => {
    // 在弹窗关闭后执行下一步操作
    })
    <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
</markdown>

关于全局Loading弹窗简易版(UI问题优化):通过window.createWindow()来实现(HarmonyOS 鸿蒙Next共享包依赖版)的问题,您也可以访问:https://www.itying.com/category-93-b0.html 联系官网客服。
21 回复

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

cke_171.png

调用代码:

Text("显示Loading").margin(20).onClick(()=>{
WindowUtils.showLoading(()=>{
console.log("wl","开始显示了")
})
})

为什么哈

我试了几种情况,没遇到你这个问题,不能确定原因,麻烦提供一下源码,在此处粘贴一下链接,我看看~

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

感谢回复哈,虽然不知道原因,但是我解决了,我一开始用的har包,静态包。然后删除重新弄了一个动态包hsp,就好了。

这个应该是系统优化,而不是通过一个方式规避吧。

如果规避是唯一的办法,也应该是系统去做。

否则就的以后写这个就得加段这样的处理代码了。

我觉得提出这个问题是好的,这个实现最好当成一个验证的列子,而不是规避的方案,反馈给鸿蒙,让他们去优化。

有道理~

返回按钮无法
WindowUtils.hideLoading()

如何解决呢?

其实使用方式弹窗就是为了屏蔽系统返回,如果不想屏蔽系统返回,可以使用promptAction.openCustomDialog()和promptAction.closeCustomDialog()来实现自定义弹窗。

好的,感谢分享~ 这边找到了两种案例,大家可以根据需求使用 https://gitee.com/harmonyos-cases/cases/blob/master/CommonAppDevelopment/feature/customdialog/README.md

能用显隐window代替创建销毁window吗?

我看window没有隐藏的api

是的,创建销毁开销会大很多

现在封装到 动态hsp后

可以在请求前,正常显示

在请求完后,正常消失了

但是,出现一个问题,就是请求完成后,如果有参数验证后,做页面跳转的

现在页面不跳转了,也没有报错

不知道,楼主有出现过类似的问题没

请问下 你的问题解决了吗

如果您能提供一个demo就好了,我看一下。

页面跳转需要用定时器 延迟跳转下

loading窗把系统权限弹窗盖住了怎么办...

我在beta3上试验了一下,权限弹窗会将loading关闭,可能各版本之间还存在着差异,所以尽量还是避免这种情况的出现吧

了解了,这个弹窗逻辑估计随着版本更新还会一直变,感谢帮助

回到顶部