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

Kotlin集成Cloud Firestore的APP点击设置页编辑按钮跳转用户页崩溃求助

问题根因

UserProfileActivity 中声明了延迟初始化属性 mUserDetails,仅当启动 Intent 携带 Constants.EXTRA_USER_DETAILS 时才会给该属性赋值。但你在 SettingsFragment 中点击编辑按钮跳转时,没有往 Intent 中传入该参数,导致后续读取 mUserDetails 相关字段时触发未初始化异常。

解决方案(二选一即可)

方案1:跳转时传入用户对象(推荐)

在 SettingsFragment 中先获取完整的 User 对象,再传入跳转 Intent 中:

  1. 先给 FirestoreClass 开放 mFireStore 访问权限,或者封装单独的用户信息查询方法
  2. 修改 SettingsFragment 编辑按钮的点击逻辑:
root.iv_edit.setOnClickListener{
    // 拉取当前登录用户完整信息
    FirestoreClass().mFireStore.collection(Constants.USERS)
        .document(FirestoreClass().getCurrentUserID())
        .get()
        .addOnSuccessListener { document ->
            val user = document.toObject(User::class.java)!!
            val intent = Intent(requireContext(), UserProfileActivity::class.java)
            // 传入User对象作为Extra参数
            intent.putExtra(Constants.EXTRA_USER_DETAILS, user)
            startActivity(intent)
        }
        .addOnFailureListener { 
            Toast.makeText(requireContext(), "获取用户信息失败", Toast.LENGTH_SHORT).show()
        }
}

方案2:UserProfileActivity内部自行拉取用户信息

不需要修改跳转逻辑,直接在页面初始化阶段自主拉取用户信息:
修改 UserProfileActivity.kt 的 onCreate 代码:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_user_profile)

    showProgressDialog("加载用户信息中...")
    // 优先读取Intent传入的用户信息,没有则自行拉取
    if(intent.hasExtra(Constants.EXTRA_USER_DETAILS)){
        mUserDetails = intent.getParcelableExtra(Constants.EXTRA_USER_DETAILS)!!
        initPageContent()
        hideProgressDialog()
    } else {
        FirestoreClass().mFireStore.collection(Constants.USERS)
            .document(FirestoreClass().getCurrentUserID())
            .get()
            .addOnSuccessListener { document ->
                mUserDetails = document.toObject(User::class.java)!!
                initPageContent()
                hideProgressDialog()
            }
            .addOnFailureListener { 
                hideProgressDialog()
                Toast.makeText(this, "加载用户信息失败", Toast.LENGTH_SHORT).show()
                finish()
            }
    }
}

// 将原有页面初始化逻辑抽为独立方法
private fun initPageContent() {
    et_usernameProfile.isEnabled=false
    et_usernameProfile.setText(mUserDetails.username)

    et_emailProfile.isEnabled=false
    et_emailProfile.setText(mUserDetails.email)

    GlideLoader(this@UserProfileActivity).loadUserPicture(mUserDetails.image.toUri(),iv_user_photo)

    iv_user_photo.setOnClickListener(this@UserProfileActivity)
    btn_save.setOnClickListener(this@UserProfileActivity)
    btn_cancel.setOnClickListener(this@UserProfileActivity)
}

额外优化建议

你当前 SettingsFragment 中声明的 private lateinit var mUserDetails: User 从未初始化,目前仅通过SharedPreferences存储了用户名和邮箱,后续如果需要展示头像、性别等信息,建议在Fragment的onViewCreated阶段提前拉取完整User对象存入该属性,避免重复发起网络请求。

内容的提问来源于stack exchange,提问作者Wee Kiat Lim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:00:03