全局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> - 隐藏Loading
WindowUtils.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 联系官网客服。
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17
调用代码:
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关闭,可能各版本之间还存在着差异,所以尽量还是避免这种情况的出现吧
了解了,这个弹窗逻辑估计随着版本更新还会一直变,感谢帮助