HarmonyOS鸿蒙Next中怎么根据系统版本import高版本系统组件?

HarmonyOS鸿蒙Next中怎么根据系统版本import高版本系统组件? 我想在api23上使用HdsTabs组件在低版本仍然使用Tabs组件,在import HdsTabs后运行在低版本系统上,app直接崩溃,报错的意思是找不到这个文件,怎么根据不同的系统版本import HdsTabs组件?低版本不import?

7 回复

尊敬的开发者,您好,可以参考应用使用API兼容性保护判断示例1中HdsActionBar兼容性保护方案解决问题。

【解决方案】

示例代码使用了6.0.0(20)版本开始支持的HdsActionBar组件,该示例展示了应用操作栏(ActionBar)在不同系统版本下的兼容性适配方案。场景中,支持点击操作栏中间的按钮,进行切换图标及展开和收起操作栏。

代码通过判断设备的distributionOSApiVersion是否达到6.0.0(20)(对应的值为60000)来实现适配:在高版本系统(6.0.0(20)及以上)中,直接使用UIDesignKit提供的HdsActionBar组件,利用其支持的startButtons、endButtons配置项快速构建操作栏,而在低版本系统中,采用Row容器与基础Button组件组合的降级方案,通过条件渲染模拟按钮的展开和收起状态,并用基本点击事件实现图标切换逻辑,确保核心交互功能在低版本设备上仍可正常使用。

import { HdsActionBar, ActionBarButton, ActionBarStyle } from '@kit.UIDesignKit';
import { deviceInfo } from '@kit.BasicServicesKit';

@Component
export struct ActionBarAdapter {
  @State isExpand: boolean = true;
  @State isPrimaryIconChanged: boolean = false;

  build() {
    Column() {
      // Compatibility judgment, 60000 is derived from the since field of the new interface M*10000 F*100 S.
      if (deviceInfo.distributionOSApiVersion >= 60000) {
        // Component that calls the API of version 6.0.0(20)
        HdsActionBar({
          startButtons: [new ActionBarButton({
            baseIcon: $r('sys.symbol.stopwatch_fill')
          })],
          endButtons: [new ActionBarButton({
            baseIcon: $r('sys.symbol.mic_fill')
          })],
          primaryButton: new ActionBarButton({
            baseIcon: $r('sys.symbol.plus'),
            altIcon: $r('sys.symbol.play_fill'),
            onClick: () => {
              this.isExpand = !this.isExpand;
              this.isPrimaryIconChanged = !this.isPrimaryIconChanged;
            }
          }),
          actionBarStyle: new ActionBarStyle({
            isPrimaryIconChanged: this.isPrimaryIconChanged
          }),
          isExpand: this.isExpand!!
        })
      } else {
        // Downgrading plan
        Row({ space: 25 }) {
          if (this.isExpand) {
            Button({ type: ButtonType.Circle }) {
              SymbolGlyph($r('sys.symbol.stopwatch_fill'))
                .fontSize(24)
                .fontColor([$r('sys.color.font_secondary')])
            }
            .aspectRatio(1)
            .height(45)
            .backgroundColor($r('sys.color.background_secondary'))
            .margin({ left: 10 })
          }

          Button({ type: ButtonType.Circle }) {
            SymbolGlyph(this.isExpand ? $r('sys.symbol.plus') : $r('sys.symbol.play_fill'))
              .fontSize(24)
              .fontColor([$r('sys.color.white')])
          }
          .aspectRatio(1)
          .height(55)
          .backgroundColor($r('sys.color.brand'))

          .onClick(() => {
            this.isExpand = !this.isExpand;
          })

          if (this.isExpand) {
            Button({ type: ButtonType.Circle }) {
              SymbolGlyph($r('sys.symbol.mic_fill'))
                .fontSize(24)
                .fontColor([$r('sys.color.font_secondary')])
            }
            .aspectRatio(1)
            .height(45)
            .backgroundColor($r('sys.color.background_secondary'))
            .margin({ right: 10 })
          }
        }
        .backgroundColor($r('sys.color.background_primary'))
        .borderRadius(30)
      }
    }
    .width('100%')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
  }
}

【参考链接】
https://developer.huawei.com/consumer/cn/doc/harmonyos-releases/arkts-api-compatibility-warning-elim#section113640223598

更多关于HarmonyOS鸿蒙Next中怎么根据系统版本import高版本系统组件?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


import { HdsActionBar } 在低版本上就会闪退,肯定不行​​​​​​​

分两个页面,进入页面之前就要做出判断:

api<23,进入Tabs组件页面;

api>=23,进入HdsTabs组件页面;


如果在api<23的页面import HdsTabs,进入页面就崩溃了,if 根本不起作用。

if判断

建议看一下这篇文章,应该能解决你的问题

https://developer.huawei.com/consumer/cn/blog/topic/03194518894292058

在HarmonyOS Next中,使用@system@ohos模块时,可通过if条件判断SystemCapability或API版本。例如:

import { AbilityConstant } from '@kit.AbilityKit';
if (AbilityConstant.LaunchReason.LAUNCH_REASON_UPGRADE > 1) {
  // 高版本组件引入
}

或利用SystemCapability.SystemFeatureisCapabilitySupported()接口动态加载。具体需查阅对应组件的版本号常量。

在 HarmonyOS Next 中,静态 import 会在编译阶段处理,低版本系统因缺少对应的模块文件会直接崩溃。正确的做法是避免顶层静态导入高版本组件,推荐两种方案:

  1. 动态 import + 条件渲染
    不直接 import { HdsTabs } from '...',而是通过 import() 函数运行时按需加载,例如:

    if (deviceInfo.sdkApiVersion >= 23) {
      import('@ohos/hds').then(module => {
        // 动态创建 HdsTabs 组件并挂载
      }).catch(() => {
        // 降级使用 Tabs
      });
    }
    

    需注意动态 import 的模块路径和权限。

  2. HSP 分包隔离
    将 HdsTabs 等仅高版本使用的组件放入独立 HSP 包中,通过路由或动态导入引用。低版本系统不会加载该分包,自然避免崩溃。

核心原则:不要在任何会被低版本加载的页面中静态 import 高版本 API 的模块,永远使用运行时判断 + 按需加载。

回到顶部