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

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),
        ));
  }
}

关键修改说明

  1. 拆分WebViewController初始化:将基础配置逻辑抽离到initWebViewController,仅做初始化不加载URL,确保控制器先就绪。
  2. 修正变量赋值:删除startLaunching内的final urlfull,直接给类成员变量赋值,保证全局变量有效。
  3. 延迟URL加载:等待从SharedPreferences获取参数并拼接完成后,再调用controller.loadRequest加载动态URL。
  4. 修复语法错误:为authUserId和username的赋值行补充分号,解决编译报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:05:19