2013-07-25 35 views
6

Khi tôi cố gắng sử dụng lớp Storage trong ứng dụng đóng gói chrome như thế này window.localStorage, nó trả về null. Mã dưới đây hoạt động tốt khi khởi chạy trong Dartium hoặc Chrome. Tại sao localstorage không hoạt động trong các ứng dụng Gói? Và tôi sẽ viết gì để có được chức năng sau?Lưu trữ cục bộ trong các ứng dụng Chrome sử dụng 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); 
} 

Trả lời

7

Theo chrome packaged app API documentation, bạn không thể sử dụng window.localStorage nhưng bạn có thể sử dụng chrome.storage để có được một API với các tính năng tương tự (và nhiều hơn nữa).

Bạn cũng cần phải yêu cầu sự cho phép lưu trữ trong biểu hiện của bạn:..

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

Hãy xem the chrome pub package mà nên cung cấp quyền truy cập vào chrome * API trong Dart (khi bạn nhập nó trong pubspec Bạn' tái đặc biệt quan tâm the chrome.storage Dart library

Ví dụ về sử dụng dưới đây (bằng cách sử dụng tùy chọn ứng dụng Chrome Packaged trong Dart biên tập New Application) ...:.

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

    }); 
} 

với HTML trông như thế này:

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

và một biểu hiện trông như thế này:

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

    "manifest_version": 2, 

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

    "permissions" : [ 
    "storage" 
    ], 

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

tôi havn't thử nghiệm nó trong Dartium, nhưng chuyển sang JS và bốc như một ứng dụng đóng gói vào Chrome v28 hoạt động tốt.

+0

Ah! Bạn có biết tại sao localstorage không được hỗ trợ không? Ngoài ra, tôi bị nhầm lẫn bởi các ví dụ cho API lưu trữ chrome bằng cách sử dụng phi tiêu. Bạn có phiền khi gửi bài thực hiện các chức năng lưu và tải không? –

+1

Mã ví dụ được thêm vào. Đảm bảo bạn thêm gói 'chrome' vào' pubspec.yaml' –

+0

@ChrisBuckett Bạn có cơ hội thử mã trong Dartium không? Vì một số lý do tôi không thể nhận được, phương thức chrome.local.set trả về mà không đặt bất kỳ thứ gì vào bộ nhớ cục bộ. – nunobaba