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

Flutter路由导航报错:Maximum call stack size exceeded 修复求助

解决Flutter中Maximum call stack size exceeded(栈溢出)错误

问题根源

  1. 路由配置错误:/main路由指向了MainApp本身,而MainApp是整个应用的根MaterialApp。当设置initialRoute: '/main'时,Flutter会尝试加载该路由对应的MainApp组件,新的MainApp又会初始化路由表并再次加载/main路由,形成无限循环,最终导致调用栈溢出。
  2. MaterialApp的home与initialRoute属性冲突:这两个属性不应同时使用,initialRoute会覆盖home的配置,同时也会加重循环问题。

修复方案

步骤1:拆分独立的首页组件

把原来MainApp中home里的页面内容拆成一个单独的HomePage组件,避免路由直接指向根MaterialApp。

步骤2:修正路由配置

将/main路由指向新的HomePage,同时移除冲突的home属性。

修复后的代码

主页面代码

import 'package:flutter/material.dart';
import 'package:flutter_application_3/secondpage.dart';

void main() {
  runApp(const MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      initialRoute: '/main',
      routes: {
        '/main': (context) => HomePage(),
        '/secondpage': (context) => SecondPage(),
      },
    );
  }
}

// 新增独立的首页组件
class HomePage extends StatelessWidget {
  const HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('First Page'),
      ),
      body: ElevatedButton(
        onPressed: () {
          Navigator.pushNamed(context, '/secondpage');
        },
        child: const Text('Go to second page'),
      ),
    );
  }
}

第二页代码(无需修改)

import 'package:flutter/material.dart';

class SecondPage extends StatelessWidget {
  const SecondPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Second Page')),
    );
  }
}

修复逻辑说明

  • 启动应用时,initialRoute: '/main'会加载独立的HomePage组件,而非根MaterialApp,彻底打破无限循环。
  • 点击按钮时,通过Navigator.pushNamed正常跳转到SecondPage,导航逻辑恢复正常。

内容的提问来源于stack exchange,提问作者John Brown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:52:37