如何使用Dart在Chrome打包应用程序中打开文件选择器

时间:2013-04-19 03:14:42

标签: dart google-chrome-app dart-js-interop

似乎没有任何飞镖包,所以我使用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:Updated code打开文件选择器并从中读取路径。但是,我不确定如何通过js_interop使用javascript FileReader对象。

Edit3:请参阅Dart邮件列表中的discussion

2 个答案:

答案 0 :(得分:3)

  

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

我已经实现了一个非常hacky的解决方案,这里有一个与你类似的例子:

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

我解决这个问题的方法是实现dart:html中存在的类型(File,FileEntry,FileReader)的隐式接口。我向许多方法抛出UnimplementedError直到我需要它们。

您的要点中的问题是,您使用自己的readAsText(blob, label)类型的实例呼叫FileEntry,但您需要传递BlobFile。由于FileReader位于js中,因此您实际需要js.Proxy到BlobFile

答案 1 :(得分:2)

我猜{}不会创建selectEntry期望的地图,你需要使用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);
}));