Kotlin集成Cloud Firestore的APP点击设置页编辑按钮跳转用户页崩溃求助
问题根因
UserProfileActivity 中声明了延迟初始化属性 mUserDetails,仅当启动 Intent 携带 Constants.EXTRA_USER_DETAILS 时才会给该属性赋值。但你在 SettingsFragment 中点击编辑按钮跳转时,没有往 Intent 中传入该参数,导致后续读取 mUserDetails 相关字段时触发未初始化异常。
解决方案(二选一即可)
方案1:跳转时传入用户对象(推荐)
在 SettingsFragment 中先获取完整的 User 对象,再传入跳转 Intent 中:
- 先给
FirestoreClass开放mFireStore访问权限,或者封装单独的用户信息查询方法 - 修改
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
相关产品推荐
相关产品推荐

