Flutter结合Firebase Auth实现登录判断及启动页跳转功能报错如何解决?
问题原因
firstWidget是main函数内的局部变量,作用域仅在main函数内部,MyApp类没有权限直接访问该变量,因此会报未定义的错误。
解决方案
通过给MyApp新增构造参数的方式传递目标页面:
- 为
MyApp类新增必填的Widget类型构造参数,用来接收要展示的初始页面 - 在
runApp实例化MyApp时,把提前计算好的firstWidget传入即可
修改后完整代码如下:
Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); Widget firstWidget; User? firebaseUser = FirebaseAuth.instance.currentUser; if (firebaseUser != null) { firstWidget = const HomeScreen(); } else { firstWidget = const SplashScreen(); } // 移除const修饰,将firstWidget作为参数传入MyApp runApp(MyApp(home: firstWidget)); } class MyApp extends StatelessWidget { // 新增构造参数接收首页widget const MyApp({Key? key, required this.home}) : super(key: key); // 定义属性存储传入的初始页面 final Widget home; // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: 'Fema App', theme: theme(), // 直接使用传入的home属性 home: home, routes: routes, ); } }
逻辑优化提示
当前代码的逻辑是如果用户已登录,会直接进入首页跳过启动页。如果需要满足“首次运行优先展示启动页”的需求,可统一将初始页面设为SplashScreen,在SplashScreen的initState生命周期中做登录状态判断,展示满指定时长后再跳转到对应页面,示例逻辑如下:
class SplashScreen extends StatefulWidget { const SplashScreen({Key? key}) : super(key: key); @override State<SplashScreen> createState() => _SplashScreenState(); } class _SplashScreenState extends State<SplashScreen> { @override void initState() { super.initState(); // 2秒延时保证启动页展示时长 Future.delayed(const Duration(seconds: 2), () { User? firebaseUser = FirebaseAuth.instance.currentUser; if (firebaseUser != null) { // 已登录跳转首页 Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => const HomeScreen())); } else { // 未登录跳转登录页 Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => const LoginScreen())); } }); } @override Widget build(BuildContext context) { // 启动页UI代码 return const Scaffold( body: Center(child: Text('启动页')), ); } }
内容的提问来源于stack exchange,提问作者Gheh
相关产品推荐
相关产品推荐

