全局Loading弹窗简易版(UI问题优化):通过window.createWindow()来实现(HarmonyOS 鸿蒙Next共享包依赖版)
全局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>
- 隐藏LoadingWindowUtils.hideLoading(() => { // 在弹窗关闭后执行下一步操作 })<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 4px; right: 8px; font-size: 14px;">复制</button>
关于全局Loading弹窗简易版(UI问题优化):通过window.createWindow()来实现(HarmonyOS 鸿蒙Next共享包依赖版)的问题,您也可以访问:https://www.itying.com/category-93-b0.html 联系官网客服。
更多关于全局Loading弹窗简易版(UI问题优化):通过window.createWindow()来实现(HarmonyOS 鸿蒙Next共享包依赖版)的实战教程也可以访问 https://www.itying.com/category-93-b0.html
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17
更多关于全局Loading弹窗简易版(UI问题优化):通过window.createWindow()来实现(HarmonyOS 鸿蒙Next共享包依赖版)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

调用代码:
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没有隐藏的api
是的,创建销毁开销会大很多
现在封装到 动态hsp后
可以在请求前,正常显示
在请求完后,正常消失了
但是,出现一个问题,就是请求完成后,如果有参数验证后,做页面跳转的
现在页面不跳转了,也没有报错
不知道,楼主有出现过类似的问题没
请问下 你的问题解决了吗
如果您能提供一个demo就好了,我看一下。
页面跳转需要用定时器 延迟跳转下
我在beta3上试验了一下,权限弹窗会将loading关闭,可能各版本之间还存在着差异,所以尽量还是避免这种情况的出现吧
了解了,这个弹窗逻辑估计随着版本更新还会一直变,感谢帮助
 
        
       
                   
                   
                  


