【问题标题】:如何在 Flutter Web 中保存到 Web 本地存储
【发布时间】:2019-10-18 10:28:30
【问题描述】:

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

【问题讨论】:

    标签: flutter dart flutter-web


    【解决方案1】:

    你可以从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');
      }
    }
    

    【讨论】:

    • @dazza5000 不,这在颤振 1.9 上不起作用,你自己检查一下,你会发现它不起作用
    【解决方案2】:

    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(); 永远不会返回任何东西。
    • @EzPizza 尝试添加对shared_preferences_web: ^0.1.2+7的显式依赖
    【解决方案3】:

    有了flutter 1.10,我们可以使用universal_html 包:

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

    【讨论】:

      【解决方案4】:

      我遇到了一个类似的问题,即我的偏好没有在运行中持续存在。我以为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"]
      },
      

      【讨论】:

        【解决方案5】:

        我正在使用 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;
              }
            }
        

        【讨论】:

          【解决方案6】:

          升级到flutter 1.9 后,'dart:html' 不再编译,因为它不是Flutter 附带的 dart SDK 的一部分。 我们现在可以使用这个包,因为它支持 Android、IOS 和 WEB: crypted_preferences

          【讨论】:

          • 虽然,正如有人在 slack 中写的,看起来它仍然可用,但是分析器中有一个错误,导致 IDE 显示错误,但如果你运行它,它就可以工作。
          • 这个包需要一个路径。有人知道那应该是什么吗?
          • 它可以是任何东西,这只是它保存数据的地方。你可以看到他们使用的例子:Preferences.preferences(path: './example/prefs')
          • 这个文件需要存在吗?如果没有,它会被创建。如果不是,它需要什么格式,路径的基础是什么?
          • 如果不存在 AFAIK,它将被创建。 ./ 是您项目的根目录。
          猜你喜欢
          • 2020-07-05
          • 1970-01-01
          • 2013-04-21
          • 2017-10-21
          • 2021-12-02
          • 2020-07-13
          • 2021-06-26
          • 1970-01-01
          • 2018-11-17
          相关资源
          最近更新 更多