似乎没有任何飞镖包,所以我使用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。
答案 0 :(得分:3)
但是我不确定如何通过js_interop使用javascript FileReader对象。
我已经实现了一个非常hacky的解决方案,这里有一个与你类似的例子:
https://gist.github.com/rmsmith/5878583
我解决这个问题的方法是实现dart:html
中存在的类型(File,FileEntry,FileReader)的隐式接口。我向许多方法抛出UnimplementedError
直到我需要它们。
您的要点中的问题是,您使用自己的readAsText(blob, label)
类型的实例呼叫FileEntry
,但您需要传递Blob
或File
。由于FileReader
位于js中,因此您实际需要js.Proxy到Blob
或File
。
答案 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);
}));