4

似乎没有任何飞镖包,所以我使用的是 Javascript 互操作。这是我到目前为止所得到的:

  js.scoped(() {
    done(entry) {
      print('ok');
    }
    js.context.doneCallback = new js.Callback.once(done);
    js.context.chrome.fileSystem.chooseEntry(null, js.context.doneCallback);
  });

它失败了:

未捕获的错误:调用表单 fileSystem.chooseEntry(object, object) 与定义 fileSystem.chooseEntry(可选对象选项,函数回调)不匹配

所以似乎回调被拒绝,因为它是错误的类型。

有任何想法吗?

chrome.fileSystem docs 编辑:将可选参数改回 null(我也尝试了 Damien 在下面的建议)。

编辑:此代码现在可以使用 - 感谢 Damien!

  js.scoped(() {
    done(entry) { print('ok'); }
    js.context.chrome.fileSystem.chooseEntry(null, new js.Callback.once(done));
  });

Edit2:更新了打开文件选择器并从中读取路径的代码。但是我不确定如何通过 js_interop 使用 javascript FileReader 对象。

Edit3:请参阅Dart 邮件列表上的讨论。

4

2 回答 2

3

但是我不确定如何通过 js_interop 使用 javascript FileReader 对象。

我已经为此实施了一个非常hacky的解决方案,这里有一个与您类似的示例:

https://gist.github.com/rmsmith/5878583

我解决这个问题的方法是实现dart:html. 我会抛出UnimplementedError许多方法,直到我需要它们为止。

您的要点中的问题是您正在readAsText(blob, label)使用自己FileEntry类型的实例进行调用,但您需要传递 a Blobor File。由于FileReader在 js 中,你实际上需要一个 js.Proxy 到Blobor File

于 2013-05-18T06:24:28.133 回答
2

我猜 {} 不会创建 chooseEntry 期望的地图,您需要使用 js.map,如下所示:

chrome.fileSystem.chooseEntry(js.map({'type': 'openWritableFile'}),
  js.context.doneCallback);

但是,我一直无法通过这种方法获取磁盘上的真实文件路径(我可以获取文件内容,但路径是在虚拟文件系统中)。

编辑:我实际上使用一个函数作为第二个参数,就像这样:

chrome.fileSystem.chooseEntry(js.map({'type': 'openWritableFile'}),
    new js.Callback.once((var fileEntry) {
  print('fullPath: ' + fileEntry.fullPath);
}));
于 2013-04-19T08:03:35.130 回答