Как использовать 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, и они добавлены в проект).
Так может кто-нибудь сказать мне:
- Это как я думаю, и нет общего способа использовать API-интерфейс Cordova-Filesystem с Rikulo/Dart?
- Если 1. верно, есть ли обходной путь? У кого-нибудь есть идея, пустая записка или что-нибудь еще, что может мне помочь?
2 ответа
Rikulo пока не поддерживает API файловой системы Cordova. Вы можете внести свой вклад или попробовать вместо этого использовать window.requestFileSystem.
Объект, возвращаемый в 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