Flutter安卓应用更新用户时触发SIGSEGV崩溃问题求助
Flutter应用点击「保存更改」崩溃(SIGSEGV空指针)排查与修复
问题概述
点击「保存更改」按钮更新用户信息时,应用触发Fatal signal 11 (SIGSEGV)错误,原因是空指针引用,以下是针对性排查思路和解决方案:
排查与修复步骤
1. 修复Expanded组件的错误使用
代码中Accordion内的SettingsTile直接将Expanded作为trailing参数,而Expanded必须作为Row/Column/Flex的直接子组件,这种错误布局可能触发底层渲染崩溃:
// 错误代码 content: SettingsTile( trailing: Expanded( child: PasswordTextField(...) ), ),
修复方案:给Expanded套一层Row容器:
content: SettingsTile( trailing: Row( children: [ Expanded( child: PasswordTextField( passController: _newPasswordController, titleText: S.current.new_password, allowEmpty: true, ), ), ], ), showDivider: false, ),
2. 验证事件参数的非空性
触发AuthUpdateUserEvent前,先检查核心参数是否为空,避免空指针传递到Bloc逻辑中:
onPressed: () { String newPassword = ""; if (_formKey.currentState?.validate() ?? false) { // 新增非空校验 if (user == null || user.email == null) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(S.current.user_data_error)), ); return; } newPassword = _newPasswordController.text.trim(); final editedFirstName = _firstNameController.text.trim(); final editedLastName = _lastNameController.text.trim(); final editedEmail = _emailController.text.trim(); context.read<AuthBloc>().add( AuthUpdateUserEvent( user: user.copyWith( firstName: editedFirstName, lastName: editedLastName, email: editedEmail, password: newPassword.isEmpty ? null : newPassword, ), email: user.email, ), ); } },
同时检查AuthBloc中处理AuthUpdateUserEvent的逻辑,确保对password: null的情况做跳过处理,而非直接使用null值。
3. 检查PasswordTextField组件实现
确认PasswordTextField内部是否正确处理了allowEmpty: true的场景:
- 避免直接调用
passController.text.trim()而未判断null - 验证逻辑中不要强制要求非空输入
4. 同步控制器文本与Bloc状态
initState中用UserRepository.currentUser初始化控制器,可能存在与Bloc状态数据不一致的情况,在BlocBuilder中同步控制器文本:
if (state is AuthAuthenticated) { final user = state.user; // 同步控制器与Bloc状态数据 if (_firstNameController.text != user.firstName) { _firstNameController.text = user.firstName ?? ""; } if (_lastNameController.text != user.lastName) { _lastNameController.text = user.lastName ?? ""; } if (_emailController.text != user.email) { _emailController.text = user.email ?? ""; } // 后续原有代码 }
5. 在Bloc中捕获异常
在Bloc处理AuthUpdateUserEvent的逻辑中添加异常捕获,避免异常传播到Native层:
// 假设Bloc使用on方法处理事件 on<AuthUpdateUserEvent>((event, emit) async { try { // 原有用户更新逻辑 } catch (e, stackTrace) { debugPrint("用户更新失败: $e"); debugPrintStack(stackTrace: stackTrace); emit(AuthErrorState(message: S.current.update_failed)); } });
内容的提问来源于stack exchange,提问作者freaklessgamer
相关产品推荐
相关产品推荐

