2013-04-19 4 views
4

Для этого не существует пакетов для дарт, поэтому я использую Javascript interop. Это то, что я получил до сих пор:Как открыть файл-подборщик в хромированном упакованном приложении с помощью Dart

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

Это неудачу с:

Uncaught Error: Invocation of form fileSystem.chooseEntry(object, object) doesn't match definition fileSystem.chooseEntry(optional object options, function callback)

Так что, похоже обратный вызов отвергается, потому что это неправильный тип.

Любые идеи?

chrome.fileSystem docs Редактировать: Изменен необязательный параметр обратно до нуля (я также попробовал предложение Damien ниже).

Редактировать: этот код работает сейчас - спасибо Damien!

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

Edit2: Updated code который открывает файл Chooser и считывает путь от него. Однако я не уверен, как использовать объект javascript FileReader через js_interop.

Редактировать3: См. discussion в списке рассылки Дартс.

ответ

3

However I'm not sure how to use a javascript FileReader object via js_interop.

Я реализовал очень Hacky решение этой проблемы, с подобным примером для твоего здесь:

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

путь я подошел к вопросу заключается в реализации неявных интерфейсов типов (File, FileEntry, FileReader), которые существуют в dart:html. Я бросаю UnimplementedError для многих методов, пока они мне не нужны.

Вопрос в вашей сущности, что вы называли readAsText(blob, label) с экземпляром собственного FileEntry типа, но вам нужно пройти Blob или File. Поскольку FileReader находится в js, вам действительно нужен js.Proxy для Blob или File.

+0

Хорошая работа! Благодарю. –

2

Я думаю, {} не создает карту chooseEntry ожидает, и вы должны использовать js.map, как это:

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

Однако, я не был в состоянии получить реальный путь к файлу на диск с этим методом (я могу получить содержимое файла, но путь находится в виртуальной файловой системе).

Edit: Я на самом деле, используя функцию в качестве второго параметра, как это:

chrome.fileSystem.chooseEntry(js.map({'type': 'openWritableFile'}), 
    new js.Callback.once((var fileEntry) { 
    print('fullPath: ' + fileEntry.fullPath); 
})); 
+0

Я думаю, что этот метод должен открыть выборщик. Я хотел бы, чтобы пользователь выбирал файл, а затем читал содержимое. Меня не интересует путь. Кроме того, docs говорят, что первый аргумент является необязательным, я играл с несколькими вариантами, нулевой должен работать. Я думаю, что это не работает во втором аргументе, который должен быть функцией типа, но по какой-то причине объект передается. http://developer.chrome.com/apps/fileSystem.html Спасибо за предложение хотя;) –

+0

Правильно, я фактически использовал функцию в качестве второго параметра. Я помню, что у меня были те же проблемы, что и у вас с первым. Я также не понимал, почему дополнительный параметр вызывает проблемы. – Damien

+0

Yup - встроенный вызов конструктора исправляет его - причудливо. js.context должен обертывать функцию в объект. –