Android Kotlin开发:Firebase更新用户名后显示Kotlin.Unit问题求助
解决Firebase更新用户名后显示Kotlin.Unit的问题
核心问题分析
- 错误赋值导致etUsername为Kotlin.Unit:
binding.usernameField.setText(usernameFinal)返回的是Unit(setText是无返回值的函数),调用.toString()后得到字符串"Kotlin.Unit",后续保存的就是这个错误值。 - 未获取用户修改后的输入值:全局变量
etUsername仅在初始化时赋值,用户修改EditText后未更新该变量,导致保存的还是旧的错误值。 - 冗余Binding实例:
bindingProfileActivity在当前Activity中实例化毫无意义,属于无效代码。 - Firebase异步操作未正确处理:
update是异步操作,直接同步返回值可能导致数据未更新完成就执行后续逻辑。
修复后的代码
class EditProfile : AppCompatActivity() { lateinit var binding: ActivityEditProfileBinding lateinit var userProfileModel: UserModel lateinit var currentUserId: String override fun onCreate(savedInstanceState: Bundle?) { binding = ActivityEditProfileBinding.inflate(layoutInflater) super.onCreate(savedInstanceState) enableEdgeToEdge() setContentView(binding.root) // 获取当前用户ID currentUserId = FirebaseAuth.getInstance().currentUser?.uid!! // 从Firebase加载当前用户名到EditText Firebase.firestore.collection("users") .document(currentUserId) .get() .addOnSuccessListener { document -> userProfileModel = document.toObject(UserModel::class.java)!! // 直接设置EditText文本,无需赋值给变量 binding.usernameField.setText(userProfileModel.username) } // 保存按钮点击事件 binding.savePfpButton.setOnClickListener { saveUsername() } } // 更新用户名方法 private fun saveUsername() { // 获取用户当前输入的用户名 val updatedName = binding.usernameField.text.toString().trim() if (updatedName.isEmpty()) { UiUtil.showToast(applicationContext, "用户名不能为空") return } val updatedProf = mapOf( "username" to updatedName ) // 异步更新Firebase,在回调中处理结果 Firebase.firestore.collection("users").document(currentUserId) .update(updatedProf) .addOnSuccessListener { UiUtil.showToast(applicationContext, "用户名更新成功") // 更新完成后关闭当前页面,回到个人资料页 finish() } .addOnFailureListener { e -> UiUtil.showToast(applicationContext, "更新失败:${e.message}") } } }
关键修复点
- 移除错误赋值逻辑:直接调用
setText设置EditText内容,不再将返回值赋值给变量。 - 实时获取输入值:在
saveUsername中通过binding.usernameField.text.toString().trim()获取用户最新输入,避免依赖全局变量。 - 正确处理异步操作:为Firebase的
update方法添加成功/失败回调,确保操作完成后再给出反馈,并可在成功后关闭当前页面,让个人资料页重新加载最新数据。 - 清理冗余代码:删除无用的
bindingProfileActivity实例和etUsername全局变量。
内容的提问来源于stack exchange,提问作者bluecollarwannabe
相关产品推荐
相关产品推荐

