Flutter Web 的 Shared_Preferences?

Jas*_* O. 11 async-await flutter

Shared_preferences ( https://pub.dev/packages/shared_preferences ) 似乎不适用于 Flutter for Web。

我有按下按钮时调用的以下函数。

 getEmail() async {
    print("reached 1st line");
    SharedPreferences prefs = await SharedPreferences.getInstance();
    print("reached 2nd line");
    String _confirmedEmail = prefs.getString('_confirmedEmail') ?? "";
)
Run Code Online (Sandbox Code Playgroud)

它打印“到达第一行”而不是“到达第二行”,这意味着程序没有通过 await 语句。有趣的是,我也没有收到任何错误。它似乎只是忽略了 await 语句之后的其余函数。

在 Flutter for Web 中存储共享首选项的最佳选择是什么?

小智 21

好消息,从 0.5.6 版本开始,shared_prefs flutter 默认支持 web

现在它包括了网络shared_preferences

您的代码应该无需更改即可运行,只需更新pubspec.yaml 中的依赖

dependencies:
 shared_preferences: ^0.5.6
Run Code Online (Sandbox Code Playgroud)

  • 这些共同偏好会持续多久?我看到,当我执行“flutter run -d chrome”时,我能够在该会话期间存储显示在该会话中的内容,但是如果我在浏览器上点击刷新,则会丢失我的共享首选项。这是按设计工作的吗?这可能与在调试模式下运行有关吗? (2认同)

小智 17

现在最新的shared_preference包包含了网络支持。但是,如果您在调试 Web 模式下运行,您将看到共享首选项在 Web 上不起作用。

原因是Flutter Web每次都运行在随机端口上,无法重新收集共享或存储的数据。

测试这一点的最佳方法是在网络上运行 flutter 应用程序两次并检查 URL,它将始终显示不同的端口。

localhost:5050/#/
Run Code Online (Sandbox Code Playgroud)

要解决此问题,请强制 flutter 在同一端口上运行应用程序。

您可以通过在这样的终端在网络上运行 flutter 应用程序时添加端口来完成此操作。

flutter run -d chrome --web-hostname localhost --web-port 5050
Run Code Online (Sandbox Code Playgroud)

或者您可以像这样在 VS Code 的 lauch.json 文件中添加端口。

"version": "0.2.0",
"configurations": [
    {
        "name": "appname",
        "request": "launch",
        "type": "dart",
        "args": ["--web-port", "5050"]
    },
Run Code Online (Sandbox Code Playgroud)

这将帮助您维护会话并检索数据。