You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中点击文本框时WebView自动重载问题求助(webview_flutter^4.4.4)

解决WebView点击文本框自动重载的问题

问题根源

你在build方法里直接实例化WebViewController,每次Widget重建(比如点击输入框唤起系统键盘、页面布局调整等场景)都会重新创建控制器并触发页面加载,这就是WebView自动重载的核心原因。

解决方案

把WebViewController的初始化逻辑移到State的initState方法中,用成员变量保存实例,确保整个Widget生命周期内只创建一次控制器。

修改后的代码示例

class _YourWebViewState extends State<YourWebViewWidget> {
  late final WebViewController _webViewController;

  @override
  void initState() {
    super.initState();
    _webViewController = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setBackgroundColor(const Color(0x00000000))
      ..setNavigationDelegate(
        NavigationDelegate(
          onNavigationRequest: (NavigationRequest request) {
            if (request.url.contains(returnURL)) {
              final uri = Uri.parse(request.url);
              final payerID = uri.queryParameters['PayerID'];
              if (payerID != null) {
                Get.find<PricePlaningController>()
                    .executePayment(executeUrl, payerID, accessToken)
                    .then((id) {
                  widget.onFinish(id);
                  Navigator.of(context).pop();
                });
              } else {
                Navigator.of(context).pop();
              }
              Navigator.of(context).pop();
            }
            if (request.url.contains(cancelURL)) {
              Navigator.of(context).pop();
            }
            return NavigationDecision.navigate;
          },
        ),
      )
      ..loadRequest(Uri.parse(checkoutUrl));
  }

  @override
  Widget build(BuildContext context) {
    return WebViewWidget(controller: _webViewController);
  }
}

额外检查点

  • 确认父Widget没有不必要的状态更新,避免触发当前WebViewWidget频繁build
  • 若使用GetX,排查相关控制器的状态变化是否会间接导致当前Widget重建

内容的提问来源于stack exchange,提问作者Syed Mahamudul Hasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 12:44:53