【问题标题】:Webview constantly refreshing - Flutter InAppWebViewWebview不断刷新——Flutter InAppWebView
【发布时间】:2026-01-28 02:35:01
【问题描述】:

所以我试图在 Webview 中设置一个 cookie(设置用户令牌),但我遇到了页面不断刷新的问题。这是代码:

InAppWebViewController _webViewController;
  final expiresDate = DateTime.now().add(Duration(days: 3)).millisecondsSinceEpoch;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: DashboardPageTitlesAtom(
        title: widget.title,
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
        trailing: IconButton(
          icon: Icon(CupertinoIcons.refresh),
          onPressed: _webViewController == null ? null : () => _webViewController.reload(),
        ),
      ),
   
      body: Column(
        children: [
          Divider(
            thickness: 1,
            height: 1,
          ),
          Expanded(
            child: InAppWebView(
                initialOptions: InAppWebViewGroupOptions(
                  crossPlatform: InAppWebViewOptions(
                    javaScriptEnabled: true,
                    clearCache: false,
                  ),
                ),
                onWebViewCreated: (InAppWebViewController controller) async {
                  _webViewController = controller;
                },
                onLoadStop: (InAppWebViewController controller, url) async {
                  try {
                    final token = await getToken();
                    await _webViewController.evaluateJavascript(
                      source:
                          'document.cookie = "accessToken=${token}"; secure=true; httpOnly=false; sameSite=None',
                    );
                    await _webViewController.loadUrl(url: widget.url);
                  } catch (e) {
                    print(e.toString());
                  }
                }),
          ),
        ],
      ),
    );
  }

问题是设置cookie的唯一方法是在评估javascript之后刷新页面并且页面刷新不会停止。谢谢。

【问题讨论】:

  • 如果 cookie 已经存在,请不要创建它。

标签: flutter dart cookies flutter-inappwebview


【解决方案1】:

您正在onLoadStop 事件中调用loadUrl 方法。这样你就创建了一个循环:

"onLoadStop" -> "loadUrl" -> "onLoadStop" -> "loadUrl" -> "onLoadStop" -> etc.

onLoadStop 被调用时,您正在加载 URL,因此 onLoadStop 将被再次调用以处理新的 URL 请求。

要实现您的需要,您应该使用 CookieManager 类并在创建 WebView 时设置 cookie(即在 onWebViewCreated 事件中)。 然后,使用您的 URL 请求调用 loadUrl 方法。

在你的场景中,你会:

onWebViewCreated: (controller) async {
  _webViewController = controller;
  try {
    // get the access token
    final token = await getToken();

    // get the CookieManager instance
    CookieManager cookieManager = CookieManager.instance();

    // set the access token
    await cookieManager.setCookie(
      url: widget.url,
      name: "accessToken",
      value: token,
      isSecure: true,
      isHttpOnly: false,
      sameSite: HTTPCookieSameSitePolicy.NONE
    );

    // then load your initial URL here
    await _webViewController.loadUrl(url: widget.url);
  } catch (e) {
    print(e.toString());
  }
},

【讨论】:

    【解决方案2】:

    试试 CookieManager

    这样调用:

    CookieManager _cookieManager = CookieManager.instance();
    
    final expiresDate =
        DateTime.now().add(Duration(days: 3)).millisecondsSinceEpoch;
    `enter code here`_cookieManager.setCookie(
      url: "https://flutter.dev/",
      name: "session",
      value: "54th5hfdcfg34",
      domain: ".flutter.dev",
      expiresDate: expiresDate,
      isSecure: true,
    );
    

    【讨论】: