HarmonyOS鸿蒙Next中图片选择器单步调试直接跳过PhotoSelectResult

HarmonyOS鸿蒙Next中图片选择器单步调试直接跳过PhotoSelectResult

let PhotoSelectOptions = new picker.PhotoSelectOptions();
PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
PhotoSelectOptions.maxSelectNumber = 5;
let photoPicker = new picker.PhotoViewPicker();
photoPicker.select((err, PhotoSelectResult) => {
  if (err) {
    console.error('PhotoViewPicker.select failed with err: ' + err);
    return;
  }
  console.info('PhotoViewPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(PhotoSelectResult));
});

对上述代码进行单步调试,在选择完图片后没有进入第二和第三个断点处,直接跳出了


更多关于HarmonyOS鸿蒙Next中图片选择器单步调试直接跳过PhotoSelectResult的实战教程也可以访问 https://www.itying.com/category-93-b0.html

12 回复

拉起图库,选择图片后能正常接收到数据,但是图库没有自动关闭,它就在最近项目里存在着。

找半天也没找到关闭图库的方法,这很不友好啊。

各位也是这样的吗?

更多关于HarmonyOS鸿蒙Next中图片选择器单步调试直接跳过PhotoSelectResult的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


异步,异步,异步;重要的事件说三遍:)

如果断点在select()语句上,执行到它停下来;单步执行即会跳向整个select()语句后面的语句;正常执行时也是如此;类似于将select()交给别人去执行了;当前代码流会自动向后执行;只有select()执行完毕有结果后(无论是成功还是失败),才会通过回调callback或Promise(暂时都统称为回调) 再回来执行回调中的代码;因此这种单步调试没法进入回调;

后面一种将断点放在回调内部语句,自然会在回调已经被拉起时停止,此时当然可以看到回调内部执行情况;

转鸿蒙开发第一个要转变的思想即 同步与异步的思维转换,不然好多逻辑理解上会与实际情况出现错位;简单来说异步方法的调用类似射出去一个回旋镖,然后继续手头的事儿,过一会儿镖转回来后再接镖处理,可看一下:

https://developer.huawei.com/consumer/cn/forum/topic/0201148145311180335?fid=0101587866109860105

我的代码

async saveAvatar() {
    agconnect.instance().init(getContext(this))
    const storageManagement = agconnect.cloudStorage(agconnect.instance())
    const storageReference = await storageManagement.storageReference()
    const reference = storageReference.child(`${this.avatarName}.jpg`)
    const file = fs.openSync(this.localAvatar, fs.OpenMode.READ_ONLY)
    const stat = fs.statSync(file.fd)
    let buf = new ArrayBuffer(stat.size)
    const ss = fs.fdopenStreamSync(file.fd, 'r')
    ss.readSync(buf)
    const uploadTask = reference.putData(buf)
    uploadTask.on('progress', (uploadedSize: number, totalSize: number) => {
        const percent = (uploadedSize / totalSize) * 100
        promptAction.showToast({ message: percent.toString() })
    })
    uploadTask
      .then(() => promptAction.showToast({ message: 'succ!' }))
      .catch((err) => promptAction.showToast({ message: 'fail:' + JSON.stringify(err) }))
}
 
doPickPhoto() {
    // 图片选择器
    let PhotoSelectOptions = new picker.PhotoSelectOptions();
    PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
    PhotoSelectOptions.maxSelectNumber = 5;
    let photoPicker = new picker.PhotoViewPicker();
    photoPicker.select(PhotoSelectOptions).then(PhotoSelectResult => {
      this.localAvatar = PhotoSelectResult.photoUris[0]
    })
}
 
editAvatar() {
    this.doPickPhoto()
    // 生成随机id
    this.avatarName = util.generateRandomUUID(false)
    // 上传云端
    this.saveAvatar()
}

HarmonyOS的分布式文件系统让我在多设备间共享文件变得更加方便。

是不是编辑完代码没有重启 debugger 啊?

遇到无解问题,记住重启 deveco,重启手机,我之前就有个问题困扰了一周,重启手机解决的!

很奇怪,我最开始是因为无法上传图片到云存储debug看看是什么问题的,结果发现没拿到图片选择器的uri,提了工单然后写出一个text组件显示uri是拿到了的,但是debug跳不到哪里,而且无论debug还是直接运行都上传不到云存储,很奇怪,

上传云存储,按官方的文档会报错,之前有个帖子讨论的,可能在 next 版本会修复,现在有个临时方案:

https://developer.huawei.com/consumer/cn/forum/topic/0201138455399719197?fid=0102683795438680754&pid=0307141296968662142

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17

我把那段代码放在了函数里,直接运行没上传成功,单步调试发现那段代码没运行直接跳过了,

突然又可以调试出url了,好奇怪

在HarmonyOS鸿蒙Next中,图片选择器的单步调试直接跳过PhotoSelectResult,可能是由于调试过程中断点未正确设置或调试器未能捕获到相关事件。确保调试器配置正确,并且断点设置在PhotoSelectResult相关的代码行上。此外,检查是否有异步操作或回调未被正确处理,导致调试器跳过该步骤。调试时,可以使用调试器的步进功能逐步执行代码,观察变量和调用栈的状态,以定位问题。

在HarmonyOS鸿蒙Next中,如果图片选择器的单步调试直接跳过PhotoSelectResult,可能是由于以下原因:

  1. 异步操作:图片选择器可能使用了异步操作,导致调试时直接跳过。确保在调试时正确处理异步回调。

  2. 断点位置:检查断点是否设置在正确的位置。如果断点设置在异步操作之后,可能会跳过PhotoSelectResult

  3. 调试工具配置:检查调试工具的配置,确保没有设置跳过某些步骤。

  4. 代码逻辑:检查代码逻辑,确保在PhotoSelectResult之前没有提前返回或跳过的逻辑。

建议在异步回调中设置断点,并逐步调试以定位问题。

回到顶部