【发布时间】:2019-10-18 10:28:30
【问题描述】:
我有一个使用 flutter for web 构建的网站,目前正在尝试保存到网络本地存储或 cookie,但似乎找不到任何插件或存档方式。 p>
【问题讨论】:
标签: flutter dart flutter-web
我有一个使用 flutter for web 构建的网站,目前正在尝试保存到网络本地存储或 cookie,但似乎找不到任何插件或存档方式。 p>
【问题讨论】:
标签: flutter dart flutter-web
你可以从dart:html使用window.localStorage
import 'dart:html';
class IdRepository {
final Storage _localStorage = window.localStorage;
Future save(String id) async {
_localStorage['selected_id'] = id;
}
Future<String> getId() async => _localStorage['selected_id'];
Future invalidate() async {
_localStorage.remove('selected_id');
}
}
【讨论】:
shared_preferences dart 包现在支持从版本 0.5.4.7+ 开始的 Web 本地存储
类似于Android和iOS上的共享偏好,下面是web本地存储的代码sn-p
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart'; // rememeber to import shared_preferences: ^0.5.4+8
void main() {
runApp(MaterialApp(
home: Scaffold(
body: Center(
child: RaisedButton(
onPressed: _incrementCounter,
child: Text('Increment Counter'),
),
),
),
));
}
_incrementCounter() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
int counter = (prefs.getInt('counter') ?? 0) + 1;
print('Pressed $counter times.');
await prefs.setInt('counter', counter);
}
【讨论】:
SharedPreferences prefs = await SharedPreferences.getInstance(); 永远不会返回任何东西。
shared_preferences_web: ^0.1.2+7的显式依赖
有了flutter 1.10,我们可以使用universal_html 包:
import 'package:universal_html/html.dart';
// ...
// read preference
var myPref = window.localStorage['mypref'];
// ...
// write preference
window.localStorage['mypref'] = myPref;
【讨论】:
我遇到了一个类似的问题,即我的偏好没有在运行中持续存在。我以为window.localStorage 坏了。我发现 Flutter 在默认情况下每次都只是简单地使用 新端口号 启动,所以 window.localStorage 被消灭了。
这张票谈到了设置一个明确的端口。这解决了我的问题,现在window.localStorage 在运行中仍然存在:
https://github.com/Dart-Code/Dart-Code/issues/1769
在 VS Code 中,您可以在 launch.json 文件中设置端口号:
{
"name": "Flutter",
"request": "launch",
"type": "dart",
"args": ["--web-port", "8686"]
},
【讨论】:
我正在使用 shared_preferences 包将数据存储在位置存储上
class SessionManager {
static SessionManager manager;
static SharedPreferences _prefs;
static Future<SessionManager> getInstance() async {
if (manager == null || _prefs == null) {
manager = SessionManager();
_prefs = await SharedPreferences.getInstance();
}
return manager;
}
void putCityId(String cityId) {
_prefs.setString("KEY_CITY_ID", cityId);
}
String getCityId() {
return _prefs.getString("KEY_CITY_ID") ?? "";
}
}
shared_preferences 仅存储当前会话的数据。
如果您想永久存储数据,那么您应该使用 cookie 来存储数据。
Cookie 用于在浏览器 cookie 上存储数据。
import 'dart:html';
class CookieManager {
static CookieManager _manager;
static getInstance() {
if (_manager == null) {
_manager = CookieManager();
}
return _manager;
}
void _addToCookie(String key, String value) {
// 2592000 sec = 30 days.
document.cookie = "$key=$value; max-age=2592000; path=/;";
}
String _getCookie(String key) {
String cookies = document.cookie;
List<String> listValues = cookies.isNotEmpty ? cookies.split(";") : List();
String matchVal = "";
for (int i = 0; i < listValues.length; i++) {
List<String> map = listValues[i].split("=");
String _key = map[0].trim();
String _val = map[1].trim();
if (key == _key) {
matchVal = _val;
break;
}
}
return matchVal;
}
}
【讨论】:
升级到flutter 1.9 后,'dart:html' 不再编译,因为它不是Flutter 附带的 dart SDK 的一部分。
我们现在可以使用这个包,因为它支持 Android、IOS 和 WEB:
crypted_preferences
【讨论】:
Preferences.preferences(path: './example/prefs')
./ 是您项目的根目录。