You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:12:01