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

Flutter权限分配报错:NoSuchMethodError调用null的idUser setter

解决Flutter权限分配中的NoSuchMethodError错误

问题原因

错误Unhandled Exception: NoSuchMethodError: The setter 'idUser=' was called on null是因为AdministratorRolesAssignController中的rol对象为null,调用rol.idUser = idUser时触发空指针异常。大概率是页面初始化时传入的rol参数未正确赋值,或者该参数本身就为null。

解决方案

1. 避免空对象调用

修改assignRol方法,不再依赖传入的rol对象,而是创建新的Rol实例仅传递分配权限所需的字段(用户ID和角色ID),同时增加参数校验:

void assignRol() async {
  // 校验用户和角色是否已选择
  if (idUser == null || idUser.isEmpty || idRol == null || idRol.isEmpty) {
    Fluttertoast.showToast(msg: '请选择用户和角色');
    return;
  }

  // 创建仅包含必要字段的Rol实例
  Rol assignRol = Rol(
    idUser: idUser,
    idRol: idRol,
  );

  // 调用接口并处理结果
  ResponseApi responseApi = await _rolesProvider.assignRol(assignRol);
  Fluttertoast.showToast(msg: responseApi.message);

  if (responseApi.success) {
    Navigator.pop(context); // 成功后返回上一页
  }

  print('Usuario elegido: ${idUser}');
  print('Rol elegido: ${idRol}');
}

2. 确保控制器中rol对象非空

如果需要保留传入rol的逻辑,修改init方法,给rol设置默认值避免null:

Future init(BuildContext context, Function refresh, [Rol rol]) async {
  this.context = context;
  this.refresh = refresh;
  this.rol = rol ?? Rol(); // 若传入null则创建空实例
  user = User.fromJson(await _sharedPref.read('user'));
  _usersProvider.init(context, sessionUser: user);
  _rolesProvider.init(context, user);

  getUsers();
  getRoles();
  refresh();
}

3. 后端SQL表适配

确保后端有存储用户-角色关联的表(例如user_roles),表结构应包含:

  • user_id:关联用户表ID
  • role_id:关联角色表ID
  • 可选:主键、创建时间等字段

后端接口api/roles/assign需要接收id_user和id_rol参数,执行插入或更新操作到关联表中。

额外优化建议

  • 在页面UI中,禁用未选择用户和角色时的"分配"按钮,避免无效操作
  • 处理getUsers和getRoles的null返回,避免UI渲染异常

内容的提问来源于stack exchange,提问作者Marcelo_uy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:39:52