liyubing

Merge remote-tracking branch 'origin/main'

@@ -11,6 +11,7 @@ export struct CustomToast { @@ -11,6 +11,7 @@ export struct CustomToast {
11 fontSizeValue :number | string | Resource = "27lpx" 11 fontSizeValue :number | string | Resource = "27lpx"
12 lineHeightValue :number | string | Resource = "38lpx" 12 lineHeightValue :number | string | Resource = "38lpx"
13 controller: CustomDialogController 13 controller: CustomDialogController
  14 + marginTop :number | string | Resource = 0
14 15
15 dismiss: () => void = () => { 16 dismiss: () => void = () => {
16 } 17 }
@@ -38,5 +39,6 @@ export struct CustomToast { @@ -38,5 +39,6 @@ export struct CustomToast {
38 .padding({top:"23lpx",bottom:'23lpx',left:"35lpx",right:"35lpx"}) 39 .padding({top:"23lpx",bottom:'23lpx',left:"35lpx",right:"35lpx"})
39 .backgroundColor(this.bgColor) 40 .backgroundColor(this.bgColor)
40 .opacity(this.opacityValue) 41 .opacity(this.opacityValue)
  42 + .margin({top:this.marginTop})
41 } 43 }
42 } 44 }
@@ -44,7 +44,7 @@ export struct CarderInteraction { @@ -44,7 +44,7 @@ export struct CarderInteraction {
44 44
45 build() { 45 build() {
46 Row() { 46 Row() {
47 - if(this.contentDTO.shareFlag === '1'){ 47 + if(this.contentDetailData?.shareInfo?.shareOpen === 1){
48 Row() { 48 Row() {
49 Image($r('app.media.CarderInteraction_share')) 49 Image($r('app.media.CarderInteraction_share'))
50 .width(18) 50 .width(18)
@@ -60,14 +60,9 @@ export struct CarderInteraction { @@ -60,14 +60,9 @@ export struct CarderInteraction {
60 }) 60 })
61 } 61 }
62 62
63 - if(this.contentDTO.rmhInfo != null){  
64 - if(this.contentDTO.shareInfo != null && 1 == this.contentDTO.shareInfo.shareOpen && 1 == this.contentDTO.rmhInfo.cnShareControl){  
65 - this.commentLayout()  
66 - }  
67 - }else{ 63 + if(this.contentDetailData?.openComment == 1){
68 this.commentLayout() 64 this.commentLayout()
69 } 65 }
70 -  
71 this.builderLike() 66 this.builderLike()
72 } 67 }
73 .width('100%') 68 .width('100%')
@@ -12,7 +12,8 @@ import { SearchShowRed, titleInitRes, textItem } from '../../utils/searchShowRed @@ -12,7 +12,8 @@ import { SearchShowRed, titleInitRes, textItem } from '../../utils/searchShowRed
12 const TAG = 'Card16Component'; 12 const TAG = 'Card16Component';
13 13
14 interface fullColumnImgUrlItem { 14 interface fullColumnImgUrlItem {
15 - url: string 15 + url: string,
  16 + fullUrl: string
16 } 17 }
17 18
18 19
@@ -81,15 +82,45 @@ export struct Card16Component { @@ -81,15 +82,45 @@ export struct Card16Component {
81 .lineHeight(25) 82 .lineHeight(25)
82 } 83 }
83 if (this.contentDTO.fullColumnImgUrls?.length > 0) { 84 if (this.contentDTO.fullColumnImgUrls?.length > 0) {
84 - Flex() {  
85 - ForEach(this.contentDTO.fullColumnImgUrls.slice(0, 3), (item: fullColumnImgUrlItem, index: number) => {  
86 - Image(this.loadImg ? item.url : '')  
87 - .backgroundColor(0xf5f5f5)  
88 - .flexBasis(113)  
89 - .height(75)  
90 - .margin({ right: index > 1 ? 0 : 2 }) 85 + //三图
  86 + Stack(){
  87 + Row() {
  88 + GridRow({ gutter: 2 }) {
  89 + ForEach(this.contentDTO.fullColumnImgUrls.slice(0, 3), (item: fullColumnImgUrlItem, index: number) => {
  90 + if (index < 3) {
  91 + GridCol({ span: { xs: 4 } }) {
  92 + Image(this.loadImg ? item.url || item.fullUrl : '')
  93 + .backgroundColor(0xf5f5f5)
  94 + .width('100%')
  95 + .aspectRatio(113 / 75)
  96 + .borderRadius({
  97 + topLeft: index === 0 ? $r('app.float.image_border_radius') : 0,
  98 + topRight: index === 2 ? $r('app.float.image_border_radius') : 0,
  99 + bottomLeft: index === 0 ? $r('app.float.image_border_radius') : 0,
  100 + bottomRight: index === 2 ? $r('app.float.image_border_radius') : 0,
  101 + })
  102 + }
  103 + }
  104 + })
  105 + }
  106 + }
  107 + .width(CommonConstants.FULL_PARENT)
  108 + .margin({ top: 8 })
  109 + CardMediaInfo({
  110 + contentDTO: this.contentDTO
91 }) 111 })
92 } 112 }
  113 + .width(CommonConstants.FULL_PARENT)
  114 + .alignContent(Alignment.BottomEnd)
  115 + // Flex() {
  116 + // ForEach(this.contentDTO.fullColumnImgUrls.slice(0, 3), (item: fullColumnImgUrlItem, index: number) => {
  117 + // Image(this.loadImg ? item.url : '')
  118 + // .backgroundColor(0xf5f5f5)
  119 + // .flexBasis(113)
  120 + // .height(75)
  121 + // .margin({ right: index > 1 ? 0 : 2 })
  122 + // })
  123 + // }
93 } 124 }
94 CarderInteraction({contentDTO: this.contentDTO}) 125 CarderInteraction({contentDTO: this.contentDTO})
95 //TODO 底部的:分享、评论、点赞 功能;需要引用一个公共组件 126 //TODO 底部的:分享、评论、点赞 功能;需要引用一个公共组件
@@ -2,6 +2,7 @@ import { CommonConstants } from 'wdConstant' @@ -2,6 +2,7 @@ import { CommonConstants } from 'wdConstant'
2 import { ContentDTO, CompDTO, Action, Params } from 'wdBean' 2 import { ContentDTO, CompDTO, Action, Params } from 'wdBean'
3 import { ProcessUtils, WDRouterRule, WDRouterPage } from 'wdRouter'; 3 import { ProcessUtils, WDRouterRule, WDRouterPage } from 'wdRouter';
4 import { InfomationCardClick } from '../../utils/infomationCardClick'; 4 import { InfomationCardClick } from '../../utils/infomationCardClick';
  5 +import { CardMediaInfo } from '../cardCommon/CardMediaInfo'
5 6
6 @Component 7 @Component
7 export struct HorizontalStrokeCardThreeTwoRadioForMoreComponent { 8 export struct HorizontalStrokeCardThreeTwoRadioForMoreComponent {
@@ -128,11 +129,18 @@ export struct HorizontalStrokeCardThreeTwoRadioForMoreComponent { @@ -128,11 +129,18 @@ export struct HorizontalStrokeCardThreeTwoRadioForMoreComponent {
128 Row() { 129 Row() {
129 ForEach(this.compDTO.operDataList, (item: ContentDTO, index: number) => { 130 ForEach(this.compDTO.operDataList, (item: ContentDTO, index: number) => {
130 Column() { 131 Column() {
131 - Image(item.coverUrl)  
132 - .aspectRatio(1.5)  
133 - .width(this.compDTO.operDataList.length == 2 ? 210 : 150)  
134 - .borderRadius(4)  
135 - .objectFit(ImageFit.Cover) 132 + Stack() {
  133 + Image(item.coverUrl)
  134 + .aspectRatio(1.5)
  135 + .width(this.compDTO.operDataList.length == 2 ? 210 : 150)
  136 + .borderRadius(4)
  137 + .objectFit(ImageFit.Cover)
  138 + CardMediaInfo({
  139 + livePeopleNum:false,
  140 + contentDTO: item
  141 + })
  142 + }
  143 + .align(Alignment.BottomEnd)
136 144
137 Text(item.newsTitle) 145 Text(item.newsTitle)
138 .fontSize($r("app.float.font_size_14")) 146 .fontSize($r("app.float.font_size_14"))
@@ -143,10 +151,9 @@ export struct HorizontalStrokeCardThreeTwoRadioForMoreComponent { @@ -143,10 +151,9 @@ export struct HorizontalStrokeCardThreeTwoRadioForMoreComponent {
143 .textAlign(TextAlign.Start) 151 .textAlign(TextAlign.Start)
144 .margin({ top: 8 }) 152 .margin({ top: 8 })
145 .width(this.compDTO.operDataList.length == 2 ? 210 : 150) 153 .width(this.compDTO.operDataList.length == 2 ? 210 : 150)
146 - .lineHeight(19)  
147 .lineHeight(21) 154 .lineHeight(21)
148 } 155 }
149 - .height(134) 156 + .height(this.compDTO.operDataList.length == 2 ? 190 : 150)
150 .padding({ right: 16 }) 157 .padding({ right: 16 })
151 // .offset({x:16}) 158 // .offset({x:16})
152 .onClick(() => { 159 .onClick(() => {
@@ -218,7 +225,7 @@ export struct HorizontalStrokeCardThreeTwoRadioForMoreComponent { @@ -218,7 +225,7 @@ export struct HorizontalStrokeCardThreeTwoRadioForMoreComponent {
218 left: $r('app.float.card_comp_pagePadding_lf'), 225 left: $r('app.float.card_comp_pagePadding_lf'),
219 right: $r('app.float.card_comp_pagePadding_lf'), 226 right: $r('app.float.card_comp_pagePadding_lf'),
220 top: $r('app.float.card_comp_pagePadding_tb'), 227 top: $r('app.float.card_comp_pagePadding_tb'),
221 - bottom: $r('app.float.card_comp_pagePadding_tb') 228 + bottom: 6
222 }) 229 })
223 .backgroundColor($r("app.color.white")) 230 .backgroundColor($r("app.color.white"))
224 // .backgroundColor($r("app.color.color_FE4B05")) 231 // .backgroundColor($r("app.color.color_FE4B05"))
@@ -170,7 +170,7 @@ export struct LiveHorizontalCardComponent { @@ -170,7 +170,7 @@ export struct LiveHorizontalCardComponent {
170 .width(this.compDTO.operDataList.length == 2 ? 210 : 150) 170 .width(this.compDTO.operDataList.length == 2 ? 210 : 150)
171 .lineHeight(21) 171 .lineHeight(21)
172 } 172 }
173 - .height(134) 173 + .height(this.compDTO.operDataList.length == 2 ? 190 : 150)
174 .padding({ right: 16 }) 174 .padding({ right: 16 })
175 .onClick(() => { 175 .onClick(() => {
176 InfomationCardClick.track(this.compDTO, item, this.pageId, this.pageName) 176 InfomationCardClick.track(this.compDTO, item, this.pageId, this.pageName)
@@ -243,7 +243,7 @@ export struct LiveHorizontalCardComponent { @@ -243,7 +243,7 @@ export struct LiveHorizontalCardComponent {
243 left: $r('app.float.card_comp_pagePadding_lf'), 243 left: $r('app.float.card_comp_pagePadding_lf'),
244 right: $r('app.float.card_comp_pagePadding_lf'), 244 right: $r('app.float.card_comp_pagePadding_lf'),
245 top: $r('app.float.card_comp_pagePadding_tb'), 245 top: $r('app.float.card_comp_pagePadding_tb'),
246 - bottom: $r('app.float.card_comp_pagePadding_tb') 246 + bottom: 6
247 }) 247 })
248 .backgroundColor($r("app.color.white")) 248 .backgroundColor($r("app.color.white"))
249 } 249 }
@@ -156,6 +156,7 @@ export struct OperRowListView { @@ -156,6 +156,7 @@ export struct OperRowListView {
156 this.likeBean['contentRelId'] = this.contentDetailData?.reLInfo?.relId + '' 156 this.likeBean['contentRelId'] = this.contentDetailData?.reLInfo?.relId + ''
157 } 157 }
158 console.info(TAG, 'contentDetailData----', JSON.stringify(this.contentDetailData)) 158 console.info(TAG, 'contentDetailData----', JSON.stringify(this.contentDetailData))
  159 + console.info(TAG, 'this.contentDetailData.shareInfo.shareOpen', JSON.stringify(this.contentDetailData.shareInfo.shareOpen))
159 console.info(TAG, 'likeBean----', JSON.stringify(this.likeBean)) 160 console.info(TAG, 'likeBean----', JSON.stringify(this.likeBean))
160 console.info(TAG, 'this.operationButtonList', JSON.stringify(this.operationButtonList)) 161 console.info(TAG, 'this.operationButtonList', JSON.stringify(this.operationButtonList))
161 162
@@ -384,22 +385,24 @@ export struct OperRowListView { @@ -384,22 +385,24 @@ export struct OperRowListView {
384 */ 385 */
385 @Builder 386 @Builder
386 builderShare() { 387 builderShare() {
387 - Column() {  
388 - Image(this.styleType == 1 ? $r('app.media.iv_live_comment_share') :  
389 - $r('app.media.iv_live_comment_share_white'))  
390 - .width(24)  
391 - .height(24)  
392 - .aspectRatio(1)  
393 - .interpolation(ImageInterpolation.High)  
394 - .onClick((event: ClickEvent) => {  
395 - this.share()  
396 - }) 388 + if(this.contentDetailData?.shareInfo?.shareOpen == 1) {
  389 + Column() {
  390 + Image(this.styleType == 1 ? $r('app.media.iv_live_comment_share') :
  391 + $r('app.media.iv_live_comment_share_white'))
  392 + .width(24)
  393 + .height(24)
  394 + .aspectRatio(1)
  395 + .interpolation(ImageInterpolation.High)
  396 + .onClick((event: ClickEvent) => {
  397 + this.share()
  398 + })
  399 + }
  400 + .justifyContent(FlexAlign.Center)
  401 + .height(36)
  402 + .width(48)
  403 + .borderRadius(18)
  404 + .backgroundColor(this.pageComponentType === 2 ? '#4D000000' : Color.Transparent)
397 } 405 }
398 - .justifyContent(FlexAlign.Center)  
399 - .height(36)  
400 - .width(48)  
401 - .borderRadius(18)  
402 - .backgroundColor(this.pageComponentType === 2 ? '#4D000000' : Color.Transparent)  
403 } 406 }
404 407
405 handleStyle() { 408 handleStyle() {
@@ -15,4 +15,18 @@ async function onlyWifiLoadImg(): Promise<boolean> { @@ -15,4 +15,18 @@ async function onlyWifiLoadImg(): Promise<boolean> {
15 return false 15 return false
16 } 16 }
17 17
18 -export { onlyWifiLoadImg }  
  18 +async function onlyWifiLoadVideo(): Promise<boolean> {
  19 + let loadImageOnlyWifiSwitch = await SPHelper.default.get(SpConstants.SETTING_WIFI_VIDEO_SWITCH, '') || false;
  20 + if (!loadImageOnlyWifiSwitch) {
  21 + // 开关没开,直接让加载视频
  22 + return true
  23 + }
  24 + let netWorkStatus = NetworkUtil.getNetworkType();
  25 + // 开关打开,wifi下才加载视频
  26 + if (netWorkStatus === NetworkUtil.TYPE_WIFI) {
  27 + return true
  28 + }
  29 + return false
  30 +}
  31 +
  32 +export { onlyWifiLoadImg,onlyWifiLoadVideo }
@@ -4,12 +4,13 @@ import { TabComponent } from '../widgets/details/TabComponent'; @@ -4,12 +4,13 @@ import { TabComponent } from '../widgets/details/TabComponent';
4 import { TopPlayComponent } from '../widgets/details/video/TopPlayComponet'; 4 import { TopPlayComponent } from '../widgets/details/video/TopPlayComponet';
5 import { DisplayDirection } from 'wdConstant/Index'; 5 import { DisplayDirection } from 'wdConstant/Index';
6 import mediaquery from '@ohos.mediaquery'; 6 import mediaquery from '@ohos.mediaquery';
7 -import { Logger, WindowModel } from 'wdKit/Index'; 7 +import { CustomToast, Logger, WindowModel } from 'wdKit/Index';
8 import { router, window } from '@kit.ArkUI'; 8 import { router, window } from '@kit.ArkUI';
9 import { WDAliPlayerController } from 'wdPlayer/Index'; 9 import { WDAliPlayerController } from 'wdPlayer/Index';
10 import { LiveOperRowListView } from 'wdComponent'; 10 import { LiveOperRowListView } from 'wdComponent';
11 import { publishCommentModel } from 'wdComponent/src/main/ets/components/comment/model/PublishCommentModel'; 11 import { publishCommentModel } from 'wdComponent/src/main/ets/components/comment/model/PublishCommentModel';
12 import { TrackConstants, TrackingContent, TrackParamConvert } from 'wdTracking/Index'; 12 import { TrackConstants, TrackingContent, TrackParamConvert } from 'wdTracking/Index';
  13 +import { onlyWifiLoadVideo } from 'wdComponent/src/main/ets/utils/lazyloadImg';
13 14
14 let TAG: string = 'DetailPlayLivePage'; 15 let TAG: string = 'DetailPlayLivePage';
15 16
@@ -41,7 +42,28 @@ export struct DetailPlayLivePage { @@ -41,7 +42,28 @@ export struct DetailPlayLivePage {
41 // 顶部状态栏高度 42 // 顶部状态栏高度
42 @Consume topSafeHeight: number 43 @Consume topSafeHeight: number
43 44
44 - aboutToAppear(): void { 45 + @State toastText: ResourceStr = "这是一个非Wi-Fi环境。请注意流量消耗"
  46 + dialogToast: CustomDialogController = new CustomDialogController({
  47 + builder: CustomToast({
  48 + bgColor: 0xB3000000,
  49 + opacityValue: 1,
  50 + fontSizeValue: "25lpx",
  51 + lineHeightValue: "36lpx",
  52 + msg: this.toastText,
  53 + marginTop:211/2+px2vp(this.topSafeHeight)-px2vp(84/2)
  54 + }),
  55 + autoCancel: false,
  56 + alignment: DialogAlignment.Top,
  57 + customStyle: true,
  58 + maskColor: "#00000000"
  59 + })
  60 +
  61 + showToastTip(msg: ResourceStr) {
  62 + this.toastText = msg
  63 + this.dialogToast.open()
  64 + }
  65 +
  66 + async aboutToAppear(): Promise<void> {
45 Logger.info(TAG, `wyj-aboutToAppear`) 67 Logger.info(TAG, `wyj-aboutToAppear`)
46 68
47 this.listener?.on("change", (mediaQueryResult) => { 69 this.listener?.on("change", (mediaQueryResult) => {
@@ -56,6 +78,9 @@ export struct DetailPlayLivePage { @@ -56,6 +78,9 @@ export struct DetailPlayLivePage {
56 this.getLiveDetails() 78 this.getLiveDetails()
57 this.getLiveRoomData() 79 this.getLiveRoomData()
58 80
  81 + if(!await onlyWifiLoadVideo()){
  82 + this.showToastTip(this.toastText)
  83 + }
59 } 84 }
60 85
61 async aboutToDisappear() { 86 async aboutToDisappear() {
@@ -115,7 +140,6 @@ export struct DetailPlayLivePage { @@ -115,7 +140,6 @@ export struct DetailPlayLivePage {
115 } 140 }
116 .height('100%') 141 .height('100%')
117 .width('100%') 142 .width('100%')
118 -  
119 } 143 }
120 144
121 onPageShowCus(): void { 145 onPageShowCus(): void {
1 import { ContentDetailDTO, LiveRoomDataBean } from 'wdBean/Index'; 1 import { ContentDetailDTO, LiveRoomDataBean } from 'wdBean/Index';
2 import { LiveViewModel } from '../viewModel/LiveViewModel'; 2 import { LiveViewModel } from '../viewModel/LiveViewModel';
3 -import { WindowModel } from 'wdKit/Index'; 3 +import { CustomToast, WindowModel } from 'wdKit/Index';
4 import { PlayerComponent } from '../widgets/vertical/PlayerComponent'; 4 import { PlayerComponent } from '../widgets/vertical/PlayerComponent';
5 import { PlayerInfoComponent } from '../widgets/vertical/PlayerInfoComponent'; 5 import { PlayerInfoComponent } from '../widgets/vertical/PlayerInfoComponent';
6 import { WDAliPlayerController } from 'wdPlayer/Index'; 6 import { WDAliPlayerController } from 'wdPlayer/Index';
@@ -9,6 +9,7 @@ import { LiveEmptyComponent, WDLiveViewDefaultType } from 'wdComponent/Index'; @@ -9,6 +9,7 @@ import { LiveEmptyComponent, WDLiveViewDefaultType } from 'wdComponent/Index';
9 import { PlayerEndView } from '../widgets/vertical/PlayerEndView'; 9 import { PlayerEndView } from '../widgets/vertical/PlayerEndView';
10 import { TrackConstants, TrackingButton } from 'wdTracking/Index'; 10 import { TrackConstants, TrackingButton } from 'wdTracking/Index';
11 import { LiveDetailPageLogic } from '../viewModel/LiveDetailPageLogic'; 11 import { LiveDetailPageLogic } from '../viewModel/LiveDetailPageLogic';
  12 +import { onlyWifiLoadVideo } from 'wdComponent/src/main/ets/utils/lazyloadImg';
12 13
13 const storage = LocalStorage.getShared(); 14 const storage = LocalStorage.getShared();
14 const TAG = 'DetailPlayVLivePage' 15 const TAG = 'DetailPlayVLivePage'
@@ -40,11 +41,32 @@ export struct DetailPlayVLivePage { @@ -40,11 +41,32 @@ export struct DetailPlayVLivePage {
40 //播放错误 41 //播放错误
41 @State isPlayerError: boolean = false 42 @State isPlayerError: boolean = false
42 @State isCanplay: boolean = false 43 @State isCanplay: boolean = false
  44 + @State toastText: ResourceStr = "这是一个非Wi-Fi环境。请注意流量消耗"
  45 + dialogToast: CustomDialogController = new CustomDialogController({
  46 + builder: CustomToast({
  47 + bgColor: 0xB3000000,
  48 + opacityValue: 1,
  49 + fontSizeValue: "25lpx",
  50 + lineHeightValue: "36lpx",
  51 + msg: this.toastText,
  52 + }),
  53 + autoCancel: false,
  54 + alignment: DialogAlignment.Center,
  55 + customStyle: true,
  56 + maskColor: "#00000000"
  57 + })
  58 +
  59 + showToastTip(msg: ResourceStr) {
  60 + this.toastText = msg
  61 + this.dialogToast.open()
  62 + }
43 63
44 - aboutToAppear(): void { 64 + async aboutToAppear(): Promise<void> {
45 this.openFullScreen() 65 this.openFullScreen()
46 this.getLiveRoomData() 66 this.getLiveRoomData()
47 - 67 + if(!await onlyWifiLoadVideo()){
  68 + this.showToastTip(this.toastText)
  69 + }
48 } 70 }
49 71
50 aboutToDisappear(): void { 72 aboutToDisappear(): void {
@@ -208,12 +208,16 @@ export struct PlayerRightView { @@ -208,12 +208,16 @@ export struct PlayerRightView {
208 build() { 208 build() {
209 Column() { 209 Column() {
210 this.userBuilderView() 210 this.userBuilderView()
211 - this.likeBuilderView() 211 + if (this.contentDetailData?.openLikes == 1) {
  212 + this.likeBuilderView()
  213 + }
212 this.collectBuilderView() 214 this.collectBuilderView()
213 - if (this.contentDetailData.openComment == 1) { 215 + if (this.contentDetailData?.openComment == 1) {
214 this.commentBuilderView() 216 this.commentBuilderView()
215 } 217 }
216 - this.shareBuilderView() 218 + if(this.contentDetailData?.shareInfo?.shareOpen == 1) {
  219 + this.shareBuilderView()
  220 + }
217 } 221 }
218 // .backgroundColor(Color.Blue) 222 // .backgroundColor(Color.Blue)
219 // .height('100%') 223 // .height('100%')
@@ -17,7 +17,7 @@ export struct ColumnPage { @@ -17,7 +17,7 @@ export struct ColumnPage {
17 pageId: string = ""; 17 pageId: string = "";
18 channelId: string = ""; 18 channelId: string = "";
19 pageName: string = '' 19 pageName: string = ''
20 - 20 + @Provide topSafeHeight: number = AppStorage.get<number>('topSafeHeight') || 0
21 aboutToAppear() { 21 aboutToAppear() {
22 this.pageId = this.param.pageId 22 this.pageId = this.param.pageId
23 this.channelId = this.param.channelId 23 this.channelId = this.param.channelId
@@ -26,6 +26,7 @@ export struct ColumnPage { @@ -26,6 +26,7 @@ export struct ColumnPage {
26 26
27 build() { 27 build() {
28 Column() { 28 Column() {
  29 + Blank().height(`${this.topSafeHeight}px`)
29 CustomTitleUI({ titleName: this.pageName }) 30 CustomTitleUI({ titleName: this.pageName })
30 PageComponent({ 31 PageComponent({
31 currentTopNavSelectedIndex: $currentTopNavSelectedIndex, 32 currentTopNavSelectedIndex: $currentTopNavSelectedIndex,