【问题标题】:Local Storage property does not work in Flutter Webview Plug-in本地存储属性在 Flutter Webview 插件中不起作用
【发布时间】:2020-06-05 16:59:21
【问题描述】:

我想在我的 Flutter 应用程序的 WebView 的 本地存储 中设置一些键值对。我正在使用名为 flutter_webview_plugin 的库。

我知道这个question

最终我想设置一个令牌,以便直接访问需要身份验证的 URL,该 URL 在 Chrome 的本地存储中存储为“jwt_token”。

我使用的库提供了一个withLocalStorage 属性和一个evalJavascript 方法:

flutterWebviewPlugin
        .launch("SOME_URL",
            withLocalStorage: true, withJavascript: true,)
        .whenComplete(() {
      flutterWebviewPlugin.evalJavascript("window.localStorage.setItem('key', 'key')");
      flutterWebviewPlugin.evalJavascript("alert(window.localStorage.getItem('key'))");
      flutterWebviewPlugin.evalJavascript("alert('test alert')");

运行上面的代码后,“测试警报”在我的 webview 浏览器中弹出,这表明 evalJavascript 方法工作正常,但之前使用 localStorage.getItem 方法的警报没有弹出。我尝试过使用和不使用 window 对象,所有 '' "" 组合,结果是一样的。我无法使用此 JS 方法在本地存储中设置信息。你能帮帮我吗?

【问题讨论】:

    标签: flutter dart webview local-storage


    【解决方案1】:

    你可以使用我的插件flutter_inappwebview,这是一个 Flutter 插件,允许你添加内联 WebViews 或打开一个应用内浏览器窗口,并且有很多事件、方法和选项来控制 WebViews。

    localStorage功能默认开启!

    这是一个在页面停止加载时设置和检索localStorage 值的快速示例:

    import 'dart:async';
    import 'package:flutter/material.dart';
    import 'package:flutter_inappwebview/flutter_inappwebview.dart';
    
    Future main() async {
      WidgetsFlutterBinding.ensureInitialized();
      runApp(MyApp());
    }
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => new _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      InAppWebViewController _webViewController;
    
      @override
      void initState() {
        super.initState();
      }
    
      @override
      void dispose() {
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: const Text('InAppWebView Example'),
            ),
            body: Container(
                child: Column(children: <Widget>[
                  Expanded(
                      child: InAppWebView(
                        initialUrl: "https://github.com/flutter",
                        initialHeaders: {},
                        initialOptions: InAppWebViewGroupOptions(
                          crossPlatform: InAppWebViewOptions(
                            debuggingEnabled: true,
                          ),
                        ),
                        onWebViewCreated: (InAppWebViewController controller) {
                          _webViewController = controller;
                        },
                        onLoadStart: (InAppWebViewController controller, String url) {
    
                        },
                        onLoadStop: (InAppWebViewController controller, String url) async {
                          await controller.evaluateJavascript(source: "window.localStorage.setItem('key', 'localStorage value!')");
                          await controller.evaluateJavascript(source: "alert(window.localStorage.getItem('key'))");
                        },
                      ))
                ])),
          ),
        );
      }
    }
    

    截图:

    【讨论】:

    • 嗨@Lorenzo,即使在重新加载url后插件也支持,以前设置的Localstorage值会保持不变,还是我们必须在重新加载后再次设置存储。谢谢!!
    • 它是 JavaScript。当您离开网页时,LocalStorage 值也会保留,而 SessionStorage 仅在会话中可用。但是,您需要查看官方的 JavaScript API。
    • 谢谢,我了解它与 javascript 有关,但我尝试使用您的插件在设置 LocalStorage 后加载一次 url 然后重新加载部分,
    • 如有任何问题,请向 GitHub 存储库提出问题。谢谢
    • 在IOS上,有没有在页面加载时设置它?加载完成时,整个页面已加载。如果它没有所需的值,它会被重定向。
    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2015-11-29
    • 2018-02-06
    • 2021-07-30
    • 1970-01-01
    相关资源
    最近更新 更多