Flutter使用flutter_modular热重载后自动返回初始登录页求助
嘿,我之前用flutter_modular的时候也踩过一模一样的坑!咱们先拆解下问题根源:
你现在是直接用MaterialApp配合Modular.generateRoute来实现路由,但这种方式并没有让Modular完全接管路由状态的管理。Flutter热重载会触发AppWidget的重建,普通的MaterialApp在重建时会直接重置整个路由栈,所以每次热重载都会回到你设置的initialRoute: "/"对应的登录页——这也是原生路由没这个问题的原因:原生路由要么是你自己手动维护栈状态,要么用navigatorKey牢牢hold住了路由上下文,不会轻易被热重载重置。
解决方案:改用ModularApp替代MaterialApp
flutter_modular本身提供了专门的ModularApp组件,它会帮你维护路由状态,彻底避免热重载时的路由重置问题。你只需要做这两步调整:
定义你的根路由模块(如果还没做的话)
先创建一个根模块,把路由配置都放在这里:class AppModule extends Module { @override List<Bind> get binds => []; // 这里可以放你的依赖注入配置 @override List<ModularRoute> get routes => [ ChildRoute("/", child: (context, args) => LoginPage()), // 登录页作为初始路由 // 其他路由示例 ChildRoute("/home", child: (context, args) => HomePage()), ]; }修改
AppWidget使用ModularApp
把原来的MaterialApp替换成ModularApp,并传入你的根模块:class AppWidget extends StatelessWidget { @override Widget build(BuildContext context) { return ModularApp( module: AppModule(), child: MaterialApp.router( routerDelegate: Modular.routerDelegate, routeInformationParser: Modular.routeInformationParser, // 这里可以保留你的MaterialApp原有配置,比如theme、title等 ), ); } }
为什么这样能解决问题?
ModularApp内部会独立维护路由的状态信息,热重载时不会像普通MaterialApp那样直接清空路由栈。而且MaterialApp.router是Flutter官方推荐的配合自定义路由系统的写法,和Modular的路由逻辑兼容性拉满。
另外,你之前手动定义的navigatorKey也可以不用了,Modular会自动管理导航上下文,之后跳转路由直接用Modular.to.pushNamed("/home")就好,更省心。
内容的提问来源于stack exchange,提问作者Lê Quang Bảo

