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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:04:55