flutter - 如何在 webview_flutter 中设置 Cookie?

标签 flutter cookies webview

如何在初始化期间在 webview_flutter 中设置 Cookies?

body: WebView
    initialUrl: index_url,
    javascriptMode: JavascriptMode.unrestricted,
    onWebViewCreated: (WebViewController webViewController) {
      _controller=webViewController;
    },
    javascriptChannels: <JavascriptChannel>[
      _toasterJavascriptChannel(context),
    ].toSet(),       
    onPageFinished: (String url) {
      print('Page finished loading: $url');
    },
  ),

最佳答案

您可以使用 Tow 方法设置 cookie。

解决方案 1。
使用 webViewController.evaluateJavascript()例如:

    final Completer<WebViewController> _controller =
    Completer<WebViewController>();
    WebViewController _webViewController;

    @override
    Widget build(BuildContext context) {
    _controller.future.then((controller) {
      _webViewController = controller;
        _webViewController.loadUrl(URL);
    });
    return Scaffold(
      body: SafeArea(
        child: Container(
          child:
               WebView(
            debuggingEnabled: true,
            javascriptMode: JavascriptMode.unrestricted,
            onWebViewCreated: (WebViewController webViewController) {
              _controller.complete(webViewController);
            },
            onPageFinished: (String value) {
              setSession(sessionId, _webViewController);
            },
          ),
        ),
      ),
    );
  }

void setSession(String sessionId, WebViewController webViewController) async {
  if (Platform.isIOS) {
   await webViewController.evaluateJavascript("document.cookie = 'ASP.NET_SessionId=$sessionId'");
  } else {
   await webViewController.evaluateJavascript('document.cookie = "ASP.NET_SessionId=$sessionId; path=/"');
  }
 }

但是使用它我们可以在 onPageFinished 之后设置 cookie在 Web View 中。只有在您重新加载 webview 后,此解决方案才会起作用。这意味着在第一次构建时,此方法会将 cookie 添加到 WebView 并在第二次之后获得结果。
如果您希望 WebView 加载预设 Cookie,请检查下一个解决方案

解决方案 2。使用 headers我们可以在发起 http 请求时设置 cookie。例如:
final Completer<WebViewController> _controller =
    Completer<WebViewController>();
    WebViewController _webViewController;

    @override
    Widget build(BuildContext context) {
    _controller.future.then((controller) {
      _webViewController = controller;
      Map<String, String> header = {'Cookie': 'ASP.NET_SessionId=$sessionId'};
      _webViewController.loadUrl(URL, headers: header);
    });
    return Scaffold(
      body: SafeArea(
        child: Container(
          child:
               WebView(
            debuggingEnabled: true,
            javascriptMode: JavascriptMode.unrestricted,
            onWebViewCreated: (WebViewController webViewController) {
              _controller.complete(webViewController);
            },
          ),
        ),
      ),
    );
  }

这将使用给定的 Cookie 加载 WebView。

关于flutter - 如何在 webview_flutter 中设置 Cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57751391/

相关文章:

C# 如何使用共享的 HttpClient 传递 cookie

php - 从 JS 或 CSS 文件中删除 Cookie

javascript - 如何在浏览器关闭时删除cookie? ASP.NET核心,C#

javascript - 从 Javascript 调用 PyObjc 函数

Flutter - 如何在表单数据中发送多个图像

dart - 无法弄清楚如何在 Flutter 的多项选择测验中从 List<String> 分配正确的答案值,

flutter - 如何切换到横向

flutter - flutter:RangeError(索引):无效值:有效值范围为空:

java - 如何在javafx和webview中创建或获取输入的xpath

android - 在 webview 数据上滑动动画