local-storage - Flutter webivew如何设置本地存储
问题描述
我的 Flutter 应用程序流程是这样的:
- 用户登录
- 如果登录成功,服务器返回一个令牌
- 在 webview 中将令牌设置为本地存储
Webview
全屏打开特定 URL
我正在使用这个 Webview 插件。示例代码显示它支持本地存储(它有一个withLocalStorage
选项),但没有显示如何使用它。
我试过了:
- 创建新
FlutterWebviewPlugin
实例 - 通过调用方法在新创建的实例上设置本地存储
evalJavascript
调用
launch
实例,设置withJavascript
,withLocalStorage
到true
并将其启动到 URL;//1 final flutterWebviewPlugin = new FlutterWebviewPlugin(); //2 flutterWebviewPlugin.evalJavascript("window.localStorage.setItem('token','SOMETOKEN')"); //3 flutterWebviewPlugin.launch( "https://SOMEURL", withLocalStorage: true, withJavascript: true);
如果我正确设置了本地存储,Webview
则会显示帐户页面;否则是一个登录页面(这就是发生的事情)
我还注意到evalJavascript
调用似乎不起作用。此外,更改步骤 2 和步骤 3 的顺序不会改变任何内容。
请注意,我知道这个问题。提供的答案也没有显示如何设置本地存储,也没有显示Webview
全屏,因此无法解决我的问题。
解决方案
在第 2 步中,代码在一个空about:blank
页面中进行评估。因此,保存的属性被分配给about:blank
地址而不是SOMEURL
地址。仅在Future
返回的.launch(...)
完成后尝试评估#2。
例如
flutterWebviewPlugin.launch("https://SOMEURL",
withLocalStorage: true,
withJavascript: true
).whenComplete(() {
final res = flutterWebviewPlugin.evalJavascript("(function() { try { window.localStorage.setItem('token', 'SOMETOKEN'); } catch (err) { return err; } })();");
// Wrapped `setItem` into a func that would return some helpful info in case it throws.
print("Eval result: $res");
});
推荐阅读
- docker - Nginx 代理通过而不重写 url
- c++ - 计算通用树中的叶节点(递归)
- c++ - 程序接受来自标准输入但不来自终端的输入
- android - 在 kotlin 项目中自动增加版本和内部版本号
- makefile - 带有 2 个可执行文件的 Fortran Makefile
- nginx - 获取 SSL 例程:ssl3_get_record:错误的版本号
- ios - 为什么我在 UITableView 中得到空单元格?
- java - Sentry 不适用于 lombok 日志记录(使用 1.7.30 版 Sentry)
- magento - Magento 2 - 将所有 CSS 文件移动到页脚
- sql - 我收到错误“缺少左括号”