Flutter 3 WebView动态URL拼接后loadRequest调用报错,如何解决?
Flutter WebView动态URL加载报错解决(webview_flutter 4.2.2)
问题根源分析
你的代码存在三个核心问题导致报错:
- 变量作用域错误:
startLaunching方法内定义了局部urlfull变量,覆盖了类成员变量,导致类的urlfull始终未被正确赋值。 - 语法错误:
authUserId和username的赋值行末尾缺少分号,触发编译错误。 - 初始化时机错误:WebViewController在类成员位置直接初始化并调用
loadRequest,此时startLaunching还未执行,urlfull无有效值,违反late变量的初始化规则。
修正后的完整代码
import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../config.dart'; class HomeTab extends StatefulWidget { const HomeTab({super.key}); @override // ignore: library_private_types_in_public_api _HomeTabState createState() => _HomeTabState(); } class _HomeTabState extends State<HomeTab> { late WebViewController controller; late String urlfull; @override void dispose() { super.dispose(); } @override void initState() { super.initState(); initWebViewController(); startLaunching(); } // 拆分WebViewController基础配置,避免提前加载无效URL void initWebViewController() { controller = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) ..setBackgroundColor(const Color(0x00000000)) ..setNavigationDelegate(NavigationDelegate( onProgress: (int progress) {}, onPageStarted: (String url) {}, onPageFinished: (String url) {}, onWebResourceError: (WebResourceError error) {}, )) ..enableZoom(false); } startLaunching() async { final prefs = await SharedPreferences.getInstance(); final authUserId = prefs.getString("auth_user_id")!; String username = prefs.getString("username")!; // 给类成员变量赋值,而非定义局部变量 urlfull = baseUrl + "mobile/index?q=$authUserId&u=$username"; // 获取到有效URL后再执行加载 controller.loadRequest(Uri.parse(urlfull)); } @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: Scaffold( body: WebViewWidget(controller: controller), )); } }
关键修改说明
- 拆分WebViewController初始化:将基础配置逻辑抽离到
initWebViewController,仅做初始化不加载URL,确保控制器先就绪。 - 修正变量赋值:删除
startLaunching内的final urlfull,直接给类成员变量赋值,保证全局变量有效。 - 延迟URL加载:等待从SharedPreferences获取参数并拼接完成后,再调用
controller.loadRequest加载动态URL。 - 修复语法错误:为
authUserId和username的赋值行补充分号,解决编译报错。
内容的提问来源于stack exchange,提问作者Arly Zai
相关产品推荐
相关产品推荐

