Flutter:如何将MaterialPageRoute传递的字符串传入WebViewController的loadRequest
解决方案
你的问题核心是在StatefulWidget类中直接初始化WebViewController并引用widget参数,这会导致初始化时无法获取到正确的blogUrl值,因为StatefulWidget的构造参数在类成员初始化阶段还未完成绑定。正确的做法是将WebViewController的初始化移到对应的State类中,利用State类可以访问widget属性的特性来加载URL。
修正后的完整代码
import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; class ArticleView extends StatefulWidget { final String blogUrl; const ArticleView({required this.blogUrl, super.key}); @override State<ArticleView> createState() => _ArticleViewState(); } class _ArticleViewState extends State<ArticleView> { late WebViewController controller; @override void initState() { super.initState(); // 在这里初始化WebViewController,此时可以正常访问widget.blogUrl controller = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) ..setBackgroundColor(const Color(0x00000000)) ..setNavigationDelegate( NavigationDelegate( onProgress: (int progress) { // 可以在这里添加加载进度的处理逻辑 }, onPageStarted: (String url) {}, onPageFinished: (String url) {}, onWebResourceError: (WebResourceError error) {}, onNavigationRequest: (NavigationRequest request) { if (request.url.startsWith('https://www.youtube.com/')) { return NavigationDecision.prevent; } return NavigationDecision.navigate; }, ), ) ..loadRequest(Uri.parse(widget.blogUrl)); } @override Widget build(BuildContext context) { return Scaffold( body: WebViewWidget(controller: controller), ); } }
关键修正点说明
- 将
WebViewController的定义移到_ArticleViewState类中,用late关键字标记延迟初始化。 - 在
initState方法中完成控制器初始化,此时widget.blogUrl已完成参数传递,可正常访问。 - 使用
WebViewWidget(webview_flutter最新版本的组件,替代旧版WebView)加载控制器。
home.dart代码无需修改
你原有的BlogTile组件跳转逻辑是正确的,保持原样即可。
内容的提问来源于stack exchange,提问作者AceWorld
相关产品推荐
相关产品推荐

