Dart/Flutter路由系统中获取Future返回值遇非空变量未赋值错误
解决Flutter路由中Future返回值导致的非空变量错误
错误原因
你遇到的The non-nullable local variable 'page' must be assigned before it can be used错误,核心问题在于RouteGenerator.generate是同步函数,但你在termsScreen分支里通过commonService.terms.then(...)异步赋值page。函数执行到return MaterialPageRoute时,异步回调还没触发,page变量此时未被初始化,违反了Dart非空变量必须赋值才能使用的规则。
修正方案
把异步数据的获取逻辑移到路由的builder方法中,用FutureBuilder处理异步状态,这样既符合Flutter路由的同步要求,又能正确等待Future结果:
修改后的RouteGenerator.dart代码
import 'package:chope_ton_diplome/services/CommonService.dart'; import 'package:flutter/material.dart'; class RouteGenerator { static Route generate(RouteSettings s) { CommonService commonService = CommonService(); switch (s.name) { case RouteConsts.termsScreen: ArgumentsAuth args = s.arguments as ArgumentsAuth; return MaterialPageRoute( builder: (context) => FutureBuilder<String>( future: commonService.terms, builder: (context, snapshot) { // 加载中状态 if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } // 错误状态 else if (snapshot.hasError) { return const Center(child: Text('Erreur lors du chargement des CGU')); } // 数据加载完成 else if (snapshot.hasData) { return TermsScreen(email: args.email, terms: snapshot.data!); } // 无数据状态 else { return const Center(child: Text('Contenu non disponible')); } }, ), ); default: return MaterialPageRoute( builder: (context) => const Center( child: Text('La route est inaccessible'), ), ); } } }
方案说明
- 移除同步变量
page:不再在同步函数中等待异步结果,而是将异步逻辑交给FutureBuilder处理 - 状态管理:通过
FutureBuilder的snapshot可以处理加载中、错误、成功等多种状态,提升用户体验 - 符合路由规则:
generate函数始终同步返回Route实例,不会出现变量未赋值的问题
内容的提问来源于stack exchange,提问作者Fabien Lebourgeois
相关产品推荐
相关产品推荐

