Flutter 如何在flatterweb中保存到web本地存储

Flutter 如何在flatterweb中保存到web本地存储,flutter,dart,flutter-web,Flutter,Dart,Flutter Web,我有一个网站是用flutter for web构建的,目前,我正在尝试保存到web本地存储或cookie,但似乎找不到任何插件或方法来存档。你可以使用窗口。本地存储来自dart:html import 'dart:html'; class IdRepository { final Storage _localStorage = window.localStorage; Future save(String id) async { _localStorage['selected

我有一个网站是用flutter for web构建的,目前,我正在尝试保存到web本地存储或cookie,但似乎找不到任何插件或方法来存档。

你可以使用
窗口。本地存储
来自
dart:html

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');
  }
}
导入'dart:html';
类IdRepository{
最终存储_localStorage=window.localStorage;
未来保存(字符串id)异步{
_localStorage['selected_id']=id;
}
Future getId()async=>_localStorage['selected_id'];
Future invalidate()异步{
_localStorage.remove('selected_id');
}
}

升级到
flatter 1.9
后,
'dart:html'
不再编译,因为它不是
flatter
附带的dart SDK的一部分。 我们目前可以使用此软件包,因为它支持Android、IOS和WEB:

使用
颤振1.10
我们可以使用以下软件包:

import'package:universal_html/html.dart';
// ...
//阅读偏好
var myPref=window.localStorage['myPref'];
// ...
//写入首选项
window.localStorage['mypref']=mypref;

共享首选项
dart软件包现在支持从版本开始的web本地存储

与Android和iOS上的共享首选项类似,下面是web上本地存储的代码片段

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

我遇到了一个类似的问题,我的首选项没有在跑步中保持。我以为
window.localStorage
坏了。我发现,在默认情况下,flifter每次启动时都会有一个新端口号,因此
window.localStorage
会被清除

此票证涉及设置显式端口。这解决了我的问题,现在
window.localStorage
在运行期间持续存在:

在VS代码中,您可以在launch.json文件中设置端口号:

{
    "name": "Flutter",
    "request": "launch",
    "type": "dart",
    "args": ["--web-port", "8686"]
},
我正在使用包在位置存储上存储数据

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") ?? "";
  }
}
类会话管理器{
静态会话管理器;
静态共享引用;
静态未来getInstance()异步{
if(manager==null | | | u prefs==null){
manager=SessionManager();
_prefs=等待SharedReferences.getInstance();
}
退货经理;
}
void putCityId(字符串cityId){
_prefs.setString(“关键城市ID”,城市ID);
}
字符串getCityId(){
返回_prefs.getString(“KEY\u CITY\u ID”);
}
}
共享_首选项仅存储当前会话的数据

如果要永久存储数据,则应使用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;
      }
    }
导入'dart:html';
班级经理{
静态CookieManager\u manager;
静态getInstance(){
如果(_manager==null){
_manager=CookieManager();
}
返回(u经理),;
}
void\u addToCookie(字符串键、字符串值){
//2592000秒=30天。
document.cookie=“$key=$value;max age=2592000;path=/;”;
}
字符串\u getCookie(字符串键){
字符串cookies=document.cookie;
List listValues=cookies.isNotEmpty?cookies.split(“;”):List();
字符串matchVal=“”;
对于(int i=0;i
虽然,正如有人在slack中所写的,它看起来仍然可用,但分析器中存在一个错误,使IDE显示错误,但如果您运行它,它就会工作。此包需要一个路径。有人知道这应该是什么吗?它可以是任何东西,这正是它保存数据的地方。您可以看到他们使用的示例:
Preferences.Preferences(路径:'./example/prefs')
此文件需要存在吗?如果没有,它会被创建吗。如果不是,它需要什么格式,路径的基础是什么?如果不存在,它将被创建。
/
是您项目的根。@dazza5000不,这不适用于Flatter 1.9自己检查一下,您会发现它不适用于我
SharedReferences prefs=wait SharedReferences.getInstance()从不返回任何内容。@请尝试在
共享的\u首选项\u网站^0.1.2+7上添加显式依赖项。