Как использовать API файловой системы Cordova/Phonegap с Rikulo?

Извините мой английский... Я пытаюсь написать кроссплатформенное веб-приложение изначально только для платформы Android. Я должен писать и читать файлы в файловую систему мобильного телефона. Я уже видел, что пакет rikulo_gap изначально не поддерживает API файловой системы. API файловой системы, используемый Rikulo, является тем, который, конечно, не работает на мобильной платформе.

Итак, я видел, что Js-пакет Рикуло должен сделать мой Dart-код совместимым с моим Cordova.js-файлом (v4.0.0), который включает в себя глобальную функцию requestFileSystem(постоянство, размер, функция успеха, функция отказа). Теперь я попытался заставить мой код работать, но я не вернул файловую систему - я получаю ошибки...

Вот мой Dart-код:

import 'package:rikulo_gap/device.dart';
import 'dart:js' as js;

void main() { 
 Device.init().then((device) => onDeviceReady(device)).
 catchError((ex) => print("AN ERROR OCCURED: " + ex.toString()));
}

void onDeviceReady(device) {
 var persistent = js.context['PERSISTENT']; 
 print("Should be Constant PERSISTENT of LFS: " + persistent.toString());
 var fsName = js.context.callMethod('requestFileSystem',[persistent,0,dofs,fail]);
}

void dofs(fs) {
 print("Success");
 var myFs = js.context[fs];
 print("The Return of RequestFileSystem is a: " + myFs.toString());
}

LogCat говорит:

10-23 18:08:32.589: D/CordovaLog(951): file:///android_asset/www/adam.dart.js: Line 12111 : Should be Constant PERSISTENT of LFS: 1
10-23 18:08:32.624: D/CordovaLog(951): file:///android_asset/www/adam.dart.js: Line 12111 : Success
10-23 18:08:32.649: D/CordovaLog(951): file:///android_asset/www/cordova.js: Line 1060 : processMessage failed: Stack: Error
10-23 18:08:32.649: D/CordovaLog(951):     at dart.wrapException (file:///android_asset/www/adam.dart.js:2520:15)
10-23 18:08:32.649: D/CordovaLog(951):     at JsObject.$index (file:///android_asset/www/adam.dart.js:11549:17)
10-23 18:08:32.649: D/CordovaLog(951):     at dart.J.$index$asx (file:///android_asset/www/adam.dart.js:19278:41)
10-23 18:08:32.649: D/CordovaLog(951):     at dofs (file:///android_asset/www/adam.dart.js:4185:7)
10-23 18:08:32.649: D/CordovaLog(951):     at dart.Primitives_applyFunction (file:///android_asset/www/adam.dart.js:2489:23)
10-23 18:08:32.649: D/CordovaLog(951):     at _callDartFunction (file:///android_asset/www/adam.dart.js:11464:29)
10-23 18:08:32.649: D/CordovaLog(951):     at file:///android_asset/www/adam.dart.js:11671:18
10-23 18:08:32.649: D/CordovaLog(951):     at file:///android_asset/www/plugins/org.apache.cordova.file/www/requestFileSystem.js:52:25
10-23 18:08:32.649: D/CordovaLog(951):     at success (file:///android_asset/www/plugins/org.apache.cordova.file/www/fileSystems-roots.js:40:13)
10-23 18:08:32.649: D/CordovaLog(951):     at Object.cordova.callbackFromNative (file:///android_asset/www/cordova.js:293:54)
10-23 18:08:32.649: D/CordovaLog(951): file:///android_asset/www/cordova.js: Line 1061 : processMessage failed: Message: S01 File1158866550 [{"fullPath":"\/","filesystemName":"temporary","isDirectory":true,"nativeURL":"file:\/\/\/storage\/emulated\/0\/Android\/data\/de.htwg.myAndroid\/cache\/","filesystem":0,"isFile":false,"name":""},{"fullPath":"\/","filesystemName":"persistent","isDirectory":true,"nativeURL":"file:\/\/\/storage\/emulated\/0\/","filesystem":1,"isFile":false,"name":""},{"fullPath":"\/","filesystemName":"content","isDirectory":true,"nativeURL":"cdvfile:\/\/localhost\/content\/","filesystem":1,"isFile":false,"name":""},{"fullPath":"\/","filesystemName":"files","isDirectory":true,"nativeURL":"file:\/\/\/data\/data\/de.htwg.myAndroid\/files\/","filesystem":1,"isFile":false,"name":""},{"fullPath":"\/","filesystemName":"files-external","isDirectory":true,"nativeURL":"file:\/\/\/storage\/emulated\/0\/Android\/data\/de.htwg.myAndroid\/files\/","filesystem":1,"isFile":false,"name":""},{"fullPath":"\/","filesystemName":"documents","isDirectory":true,"nativeURL":"file:\/\/\/data\/data\/de.htwg.myAndroid\/files\/Documents\/","filesystem":1,"isFile":false,"name":""},{"fullPath":"\/","filesystemName":"sdcard","isDirectory":true,"nativeURL":"file:\/\/\/storage\/emulated\/0\/","filesystem":1,"isFile":false,"name":""},{"fullPath":"\/","filesystemName":"cache","isDirectory":true,"nativeURL":"file:\/\/\/data\/data\/de.htwg.myAndroid\/cache\/","filesystem":1,"isFile":false,"name":""},{"fullPath":"\/","filesystemName":"cache-external","isDirectory":true,"nativeURL":"file:\/\/\/storage\/emulated\/0\/Android\/data\/de.htwg.myAndroid\/cache\/","filesystem":1,"isFile":false,"name":""},{"fullPath":"\/","filesystemName":"root","isDirectory":true,"nativeURL":"file:\/\/\/","filesystem":1,"isFile":false,"name":""}]       

Меня раздражает то, что первое исключение в стеке - это dart.wrapException, так что я думаю, что это общая проблема взаимодействия Dart<>Js Interop.

Я следовал официальной инструкции Cordova для сборки с Android, и в настоящее время я работаю с Windows CommandLine с cordova run android, (И да, я установил плагины (File, FileUtil, Device через CommandLine, и они добавлены в проект).

Так может кто-нибудь сказать мне:

  1. Это как я думаю, и нет общего способа использовать API-интерфейс Cordova-Filesystem с Rikulo/Dart?
  2. Если 1. верно, есть ли обходной путь? У кого-нибудь есть идея, пустая записка или что-нибудь еще, что может мне помочь?

2 ответа

Решение
  1. Rikulo пока не поддерживает API файловой системы Cordova. Вы можете внести свой вклад или попробовать вместо этого использовать window.requestFileSystem.

  2. Объект, возвращаемый в dofs, является экземпляром JsObject, поэтому вам не нужно использовать js.context преобразовать это. То есть,

    var myFs = js.context[fs];
    

    должен быть пересмотрен в

    var myFs = fs;
    

Ооо, ты был так прав в пункте 2... потерял два дня моей жизни:O (пункт 1 не может работать, потому что с пакетом dart: html функция window.requestFileSystem вызывает webKitRequestFileSystem, которая просто работает в браузере Chrome и LogCat говорит мне что-то вроде "Не поддерживает функцию webKitRequestFileSystem)

Я был раздражен, потому что fs.toString только что возвратил [Object object], поэтому я подумал, что это просто пустой Object, и потому что я подписал функцию просто с помощью dofs(fs) (без Type), которую не дал мой IDE/Dart-API мне такие предложения, как callMethod() для JsObject... Теперь я изменил это так:

void main() {
 Device.init().then((device) => onDeviceReady(device)).catchError((ex) => print("AN ERROR OCCURED: " + ex.toString()));
}
void onDeviceReady(device) {
 var persistent = context['PERSISTENT']; 
 print("Should be Constant PERSISTENT of LFS: " + persistent.toString());
 context.callMethod('requestFileSystem',[persistent,0,dofs,fail]);
}
void dofs(JsObject fs) {
 print("Success");
 var fsroot = fs['root'];
 createFile(fsroot);
}
void createFile(JsObject fsroot) {
 var cNe = new JsObject.jsify({'create': true, 'exclusive': false});
 fsroot.callMethod('getFile', ["DartCreatedFile.txt",cNe,gotFileEntry,fail]);
}
void gotFileEntry(JsObject fileEntry) {
 print(fileEntry['fullPath']);
}

И Logcat успешно говорит мне:

10-24 14:17:03.945: D/CordovaLog(6685): file:///android_asset/www/fileSystemApi.js: Line 8 : Device is Ready!!!
10-24 14:17:04.055: D/CordovaLog(6685): file:///android_asset/www/adam.dart.js: Line 12294 : Should be Constant PERSISTENT of LFS: 1
10-24 14:17:04.085: D/CordovaLog(6685): file:///android_asset/www/adam.dart.js: Line 12294 : Success
10-24 14:17:04.105: D/CordovaLog(6685): file:///android_asset/www/adam.dart.js: Line 12294 : //DartCreatedFile.txt
Другие вопросы по тегам