Flutter应用按设备返回键退出后重启黑屏崩溃如何解决?
问题根因
- 核心参数空异常:你的
homecontroller构造函数要求controllUserType和userid两个必填参数,但main.dart中定义/home路由时,直接初始化了无参的homecontroller(),没有传入任何参数。当你退出应用再冷启动时,路由直接加载该无参实例,两个必填参数为空直接触发空异常,是白屏转黑屏崩溃的核心原因。 - build方法返回逻辑错误:
HomePage的build方法括号层级错误,当isSignedIn为false时,方法没有合法返回值,会直接触发渲染异常。 - 变量未定义:
buildSignedInScreen方法中使用的_agentchildren、_agentCurrentIndex、agentonTabchangePage三个变量/方法没有定义,运行时直接抛异常。 - 语法错误:
homecontroller的build方法中重复声明了Authservice auth,会触发编译/运行错误。
修复方案
- 改造
homecontroller的参数逻辑:将controllUserType和userid改为可选参数,冷启动进入该页面且用户已登录时,主动从Firestore拉取当前登录用户的Account type和用户ID,拉取完成前显示加载动画,不要依赖路由跳转传参(应用进程被杀死后历史传参会全部丢失)。
修改示例:
class homecontroller extends StatelessWidget { final String? controllUserType; final String? userid; const homecontroller({Key? key, this.controllUserType, this.userid}):super(key: key); @override Widget build(BuildContext context) { final Authservice auth=Provider.of(context).auth; return StreamBuilder( stream:auth.authStateChanges, builder: (context,AsyncSnapshot<User> snapshot){ if(snapshot.connectionState==ConnectionState.active){ final bool SignedIn=snapshot.hasData; if(!SignedIn) return firstview(); // 已有登录态,判断是否已有用户身份参数 if(controllUserType != null && userid != null) { return HomePage(UserType:controllUserType!,userID: userid!); } // 无身份参数,异步拉取 return FutureBuilder( future: _getUserInfo(snapshot.data!.uid), builder: (context, AsyncSnapshot<Map> userInfoSnapshot) { if(userInfoSnapshot.connectionState == ConnectionState.done) { return HomePage( UserType: userInfoSnapshot.data!['userType'], userID: userInfoSnapshot.data!['userId'] ); } return const CircularProgressIndicator(); } ); }else{ return const CircularProgressIndicator(); } }, ); } // 拉取用户信息的方法 Future<Map> _getUserInfo(String uid) async { final ownerSnapshots= await ownerReference.doc(uid).get(); final userSnapshots= await userSnapshot.doc(uid).get(); if(ownerSnapshots.exists) { return { 'userType': ownerSnapshots.data()!['Account type'].toString(), 'userId': ownerSnapshots.data()!['userId'].toString() }; } else if(userSnapshots.exists) { return { 'userType': userSnapshots.data()!['Account type'].toString(), 'userId': userSnapshots.data()!['userId'].toString() }; } // 拉不到直接返回空,后续可以自行补充异常处理逻辑 return {}; } }
- 修正
HomePage的build方法括号层级,确保所有分支都有返回值,同时删掉重复的登录态判断逻辑(上层homecontroller已经校验过登录态,HomePage不需要再判断)。 - 补全
HomePage中缺失的_agentchildren、_agentCurrentIndex变量定义和agentonTabchangePage方法实现。 - 删除
homecontroller中重复的Authservice auth声明行。
内容的提问来源于stack exchange,提问作者beby
相关产品推荐
相关产品推荐

