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

Flutter Url Launcher未触发错误页面问题求助

问题分析与解决方案

你的代码里有两个核心问题导致错误页无法正常跳转:

  1. 用throw触发页面跳转完全错误,throw是用来抛出异常的,不是执行导航逻辑的,这会让代码逻辑异常中断,根本走不到导航步骤。
  2. Uri.parse('adjja')生成的是相对路径URI,launchUrl对这种情况的判定逻辑可能不会返回false,导致后续的错误处理代码没机会执行。

修正后的完整代码

class DetailPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final Uri _url = Uri.parse('adjja');
    final Uri _wa = Uri.parse('https://wa.me/62895378147657');

    Future<void> _launchUrl() async {
      // 先判断URI是否为有效绝对路径
      if (!_url.isAbsolute) {
        Navigator.push(
          context, 
          MaterialPageRoute(builder: (context) => ErrorPage())
        );
        return;
      }

      try {
        bool launched = await launchUrl(_url);
        // 启动失败则跳转错误页
        if (!launched) {
          Navigator.push(
            context, 
            MaterialPageRoute(builder: (context) => ErrorPage())
          );
        }
      } catch (e) {
        // 捕获启动时的异常(比如无对应应用处理URI),跳转错误页
        Navigator.push(
          context, 
          MaterialPageRoute(builder: (context) => ErrorPage())
        );
      }
    }

    // 补充原代码缺失的页面渲染部分
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: _launchUrl,
          child: const Text('打开链接'),
        ),
      ),
    );
  }
}

关键修正说明

  • 删掉throw,直接在条件满足时调用Navigator.push执行跳转,这才是正确的页面导航方式。
  • 增加_url.isAbsolute检查,直接拦截像'adjja'这种无效的相对URI,提前触发错误页。
  • 用try-catch包裹launchUrl,捕获它可能抛出的异常(比如设备上没有能处理该URI的应用),确保任何异常场景下都能跳转到错误页。
  • 补充了原代码缺失的Widget返回部分,保证页面能正常渲染运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:30:45