2013-07-25 7 views
6

Wenn ich versuche, die Storage Klasse in einer so großen Chrome-App wie dieser window.localStorage zu verwenden, gibt es null zurück. Der folgende Code funktioniert gut, wenn er in Dartium oder Chrome gestartet wird. Warum funktioniert der lokale Speicher nicht in Paket-Apps? Und was würde ich schreiben, um die folgende Funktionalität zu erhalten?Lokaler Speicher in Chrome-Apps mit 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); 
} 

Antwort

7

Nach dem chrome packaged app API documentation, können Sie nicht window.localStorage verwenden, aber Sie chrome.storage können eine API mit ähnlichen Eigenschaften zu erhalten (und mehr).

Sie müssen auch die Speicher Erlaubnis in Ihrem Manifest beantragen..

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

einen Blick auf the chrome pub package nehmen, die den Zugang zu Chrom bieten sollte * APIs in Dart (wenn Sie es in Ihrem pubspec importieren Sie‘ re besonders interessiert the chrome.storage Dart library

Anwendungsbeispiel unten (durch die Chrome Packaged App-Option im Dart Editor Neue Anwendung verwenden) ...:.

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>")); 
    }); 

    }); 
} 

mit HTML, die wie folgt aussehen:

...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> 
... 

und ein Manifest, das wie folgt aussieht:

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

    "manifest_version": 2, 

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

    "permissions" : [ 
    "storage" 
    ], 

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

I havn't in Dartium getestet, aber als gepackte Anwendung zu JS und Laden Umwandlung in Chrome v28 funktioniert gut.

+0

Ah! Weißt du, warum Localstorage nicht unterstützt wird? Ich werde auch durch die Beispiele für die Chrome-Speicher-API mit Dart verwirrt. Würde es Ihnen etwas ausmachen, eine Implementierung der Speicher- und Ladefunktionen zu posten? –

+1

Beispielcode hinzugefügt. Stelle sicher, dass du das "chrome" -Paket zu deinem 'pubspec.yaml' hinzufügst –

+0

@ChrisBuckett Hast du die Möglichkeit den Code in Dartium auszuprobieren? Aus einigen Gründen, die ich nicht erhalten kann, kehrt die chrome.local.set-Methode zurück, ohne etwas in den lokalen Speicher zu schreiben. – nunobaba