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

如何从其他页面将URL传递给WebViewController?

解决方法

方案1:改为StatefulWidget(推荐)

StatelessWidget无法使用生命周期方法处理初始化逻辑,而WebViewController的初始化依赖实例参数,转为StatefulWidget后可以在initState中安全完成控制器初始化:

class WebPage extends StatefulWidget {
  const WebPage({Key? key, required this.url}) : super(key: key);
  final String url;

  @override
  State<WebPage> createState() => _WebPageState();
}

class _WebPageState extends State<WebPage> {
  late final WebViewController _controller;

  @override
  void initState() {
    super.initState();
    _controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setNavigationDelegate(NavigationDelegate(
        onProgress: (int progress) {
          debugPrint("Loading: $progress%");
        },
        onPageStarted: (String url) {},
        onPageFinished: (String url) {},
        onWebResourceError: (WebResourceError error) {},
        onNavigationRequest: (NavigationRequest request) {
          return NavigationDecision.navigate;
        },
      ))
      ..loadRequest(Uri.parse(widget.url));
  }

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

方案2:在StatelessWidget中使用late final延迟初始化

如果坚持使用StatelessWidget,可以用late final修饰控制器,延迟到第一次访问时完成初始化,此时类实例已创建,可正常访问url参数:

class WebPage extends StatelessWidget {
  WebPage({Key? key, required this.url}) : super(key: key);
  final String url;

  late final WebViewController _controller = WebViewController()
    ..setJavaScriptMode(JavaScriptMode.unrestricted)
    ..setNavigationDelegate(NavigationDelegate(
      onProgress: (int progress) {
        debugPrint("Loading: $progress%");
      },
      onPageStarted: (String url) {},
      onPageFinished: (String url) {},
      onWebResourceError: (WebResourceError error) {},
      onNavigationRequest: (NavigationRequest request) {
        return NavigationDecision.navigate;
      },
    ))
    ..loadRequest(Uri.parse(url));

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

错误原因说明

  • 初始代码直接在成员初始化器中访问url,此时类实例尚未完成初始化,Dart禁止访问实例成员,触发报错:The instance member 'url' can't be accessed in an initializer。
  • 将url设为static后,虽然能访问静态成员,但构造函数的必填参数属于实例字段,不能标记为static,因此出现报错:'url' is a static field in the enclosing class. Fields initialized in a constructor can't be static.

内容的提问来源于stack exchange,提问作者Texter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:22:15