29

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

4

6 回答 6

23

你可以使用window.localStoragedart: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');
  }
}
于 2019-06-18T21:28:12.017 回答
14

shared_preferencesdart 包现在支持0.5.4.7+版本的 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);
}
于 2019-12-09T03:52:56.953 回答
8

flutter 1.10我们可以使用universal_html

import 'package:universal_html/html.dart';
// ...
// read preference
var myPref = window.localStorage['mypref'];
// ...
// write preference
window.localStorage['mypref'] = myPref;

于 2019-09-21T14:47:48.330 回答
5

我遇到了一个类似的问题,我的偏好没有在运行中持续存在。我以为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"]
},
于 2020-05-13T20:27:58.043 回答
4

我正在使用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;
      }
    }
于 2020-06-02T14:40:54.887 回答
3

升级到 后flutter 1.9'dart:html'不再编译,因为它不是随Flutter. 我们现在可以使用这个包,因为它支持 Android、IOS 和 WEB: crypted_preferences

于 2019-09-12T11:32:33.267 回答