2013-07-25 13 views
6

Gdy próbuję użyć klasy Storage w aplikacji w tej aplikacji, takiej jak ta window.localStorage, zwraca ona null. Poniższy kod działa poprawnie podczas uruchamiania w Dartium lub Chrome. Dlaczego localstorage nie działa w aplikacjach pakietu? A co napisałbym, aby uzyskać następującą funkcjonalność?Lokalna pamięć masowa w aplikacjach Chrome przy użyciu aplikacji Dart

import 'dart:json'; 

void save(List data) { 
    var jsonString = stringify(data); 
    window.localStorage['highscore'] = jsonString; 
} 

List load() { 
    var jsonString = window.localStorage['highscore']; 
    return parse(jsonString); 
} 

Odpowiedz

7

Według chrome packaged app API documentation, nie można używać window.localStorage ale można użyć chrome.storage dostać API o podobnej funkcji (i więcej).

Należy również zwrócić się o zgodę do przechowywania w swoim manifeście..

... 
"permissions": [ 
    "storage" 
], 

przyjrzeć the chrome pub package które powinny zapewnić dostęp do Chrome * API w Dart (podczas importowania go w pubspec You” re szczególnie zainteresowany the chrome.storage Dart library

Przykład zastosowania poniżej (za pomocą opcji aplikacji Chrome Pakowane w Dart Edytor nowa aplikacja) ....

import 'dart:html'; 

import 'package:js/js.dart' as js; 
import 'package:chrome/chrome.dart' as chrome; 


void main() { 
    print("Starting..."); 
    query("button").onClick.listen(onClick); 
} 


onClick(e) { 
    document.body.append(new Element.html("<p>Clicked...</p>")); 
    // save the highscore 123 
    chrome.storage.local.set({'highscore':'123'}).then((storageArea) { 

    // load the highscore 
    chrome.storage.local.get(['highscore']).then((Map<String,String> vals) { 
     var highscore = vals['highscore']; 
     document.body.append(new Element.html("<p>$highscore</p>")); 
    }); 

    }); 
} 

z HTML, który wygląda tak:

...snip 
<button>Click Me</button> 
<script src="storage.dart" type="application/dart"></script> 

<script src="packages/browser/dart.js"></script> 
<script src="packages/browser/interop.js"></script> 
<script src="packages/js/dart_interop.js"></script> 
... 

i oczywisty, że wygląda tak:

{ 
    "name": "StorageExample", 
    "version": "1", 

    "manifest_version": 2, 

    "icons": {"128": "dart_icon.png"}, 

    "permissions" : [ 
    "storage" 
    ], 

    "app": { 
    "background": { 
     "scripts": ["background.js"] 
    } 
    } 
} 

havn't testowany go w Dartium, ale konwersja do JS i załadunku jako zapakowany aplikacji do Chrome 28 działa dobrze.

+0

Ah! Czy wiesz, dlaczego usługa localstorage nie jest obsługiwana? Ponadto jestem zdezorientowany przykładami interfejsu API pamięci masowej Chrome za pomocą dart. Czy mógłbyś opublikować implementację funkcji składowania i ładowania? –

+1

Dodano przykład kodu. Upewnij się, że dodajesz pakiet 'chrome' do swojego' pubspec.yaml' –

+0

@ChrisBuckett Czy miałeś okazję wypróbować kod w Dartium? Z pewnych przyczyn nie mogę uzyskać, metoda chrome.local.set zwraca się bez umieszczania czegokolwiek w lokalnej pamięci. – nunobaba

Powiązane problemy