如何从其他页面将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
相关产品推荐
相关产品推荐

