HarmonyOS鸿蒙Next中使用DocumentScanner报错:does not comply with the UI component syntax

HarmonyOS鸿蒙Next中使用DocumentScanner报错:does not comply with the UI component syntax

使用DocumentScanner实现文档识别功能报错。

在build()中引入DocumentScanner报错

页面代码如下:

@Component
export struct DocDemoPage {
  @State docImageUris: string[] = []
  @Consume('pathStack') pathStack: NavPathStack
  private docScanConfig : DocumentScannerConfig = new DocumentScannerConfig()

  aboutToAppear() {
    this.docScanConfig.supportType = [DocType.DOC, DocType.SHEET]
    this.docScanConfig.isGallerySupported = true
    this.docScanConfig.editTabs = []
    this.docScanConfig.maxShotCount = 3
    this.docScanConfig.defaultFilterId = FilterId.ORIGINAL
    this.docScanConfig.defaultShootingMode = ShootingMode.MANUAL
    this.docScanConfig.isShareable = true
    this.docScanConfig.originalUris = []
  }

  build() {
    NavDestination() {
      Stack({ alignContent: Alignment.Top }) {
        //展示文档扫描结果
        List() {
          ForEach(this.docImageUris, (uri: string) => {
            ListItem() {
              Image(uri)
                .objectFit(ImageFit.Contain)
                .width(100)
                .height(100)
            }
          })
        }
        .listDirection(Axis.Vertical)
        .alignListItem(ListItemAlign.Center)
        .margin({
          top: 50
        })
        .width('80%')
        .height('80%')

        CardRecognition()

        //文档扫描
        DocumentScanner({
          scannerConfig: this.docScanConfig,
          onResult: (code: number, saveType: SaveOption, uris: string[]) => {
            hilog.info(0x0001, TAG, `result code: ${code}, save: ${saveType}`)
            if (code === -1) {
              this.pathStack.pop()
            }
            uris.forEach(uriString => {
              hilog.info(0x0001, TAG, `uri: ${uriString}`)
            })
            this.docImageUris = uris
          }
        })
          .size({ width: '100%', height: '100%' })
      }
      .width('100%')
      .height('100%')
      .hideTitleBar(true)
    }
    .width('100%')
    .height('100%')
    .hideTitleBar(true)
}


更多关于HarmonyOS鸿蒙Next中使用DocumentScanner报错:does not comply with the UI component syntax的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

直接复制你的代码 没有出现你说的报错,环境如下

  • DevEco Studio 5.0.4 Release
  • Build #DS-233.14475.28.36.5011110
  • Build Version: 5.0.11.110, built on May 12, 2025

HarmonyOS 5.0.4 Release SDK, inclusion of OpenHarmony SDK Ohos_sdk_public 5.0.4.150 (API Version 16 Release) as is.

更多关于HarmonyOS鸿蒙Next中使用DocumentScanner报错:does not comply with the UI component syntax的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


您好,为了更快速解决您的问题,并且吸引更多用户一同参与您问题的解答与讨论,建议您补全如下信息:

补全版本信息,让参与用户更精准定位您的问题;

更多提问技巧,请参考:《提问小技巧:让解答更高效》

根据错误提示,DocumentScanner 并非 UI 组件,不能直接在 build 方法中作为 UI 元素渲染。需将其扫描逻辑移至事件处理函数(如按钮点击)中,作为工具类使用

移除 UI 组件误用:DocumentScanner 是扫描服务工具类,而非 UI 组件,故从 build 中移除其作为 UI 元素的渲染,改为在事件(如按钮点击)中调用。

新增扫描逻辑:通过 startDocumentScan 方法初始化扫描器并处理结果,需根据实际 API 补充扫描启动方法(如 scanner.scan())。

添加交互入口:在 UI 中添加按钮,点击触发扫描,符合 UI 组件语法规范。

关键点:

区分 UI 与工具组件:确保仅 UI 组件(如 Button、List)在 build 中渲染,工具类(如扫描服务)在逻辑代码中调用。

事件驱动扫描:通过用户交互(如按钮点击)启动扫描,避免在 UI 构建阶段直接执行非 UI 逻辑。

你好,我是根据官方文档使用的https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/vision-documentscanner,是不是有更新呢?方便提供下代码?

在HarmonyOS Next中使用DocumentScanner报错"does not comply with the UI component syntax",通常是由于组件使用方式不符合ArkUI规范。DocumentScanner是系统能力,需通过接口调用而非作为UI组件使用。正确用法是通过import引入@ohos.multimedia.scan模块,调用scan.getDocumentScanner()获取实例后操作。检查是否误将扫描器当作UI组件在布局文件或组件装饰器中使用。确保API调用在生命周期回调或事件处理函数中完成。

根据错误信息和代码分析,问题出在DocumentScanner组件的使用方式上。在HarmonyOS Next中,DocumentScanner不能直接作为UI组件使用,而是需要通过调用API的方式触发文档扫描功能。

正确的使用方式应该是:

  1. 移除build()中的DocumentScanner组件声明
  2. 添加按钮触发扫描功能
  3. 使用DocumentScannerstart()方法启动扫描

修改建议:

// 添加按钮触发扫描
Button('开始扫描')
  .onClick(() => {
    DocumentScanner.start(this.docScanConfig, (code, saveType, uris) => {
      // 处理扫描结果
      this.docImageUris = uris
    })
  })

错误原因分析:

  1. DocumentScanner是服务类而非UI组件
  2. 不能直接在ArkUI的build方法中声明
  3. 需要改为API调用方式

请按照API调用的方式重构代码,移除build方法中的DocumentScanner声明,改为通过按钮触发扫描功能。

回到顶部