这个问题与 kotlin 中的 android 应用程序开发有关。所以,问题是我想更新我的应用程序上的用户名(使用 Firebase)并保存它,以便更新的用户名显示在个人资料活动中。当我单击“编辑个人资料”时,会出现一个编辑文本,其中填充了当前用户名,用户可以对其进行修改,单击“保存”并进行更改。当我尝试保存编辑后的用户名时,问题出现了,它显示 Kotlin.Unit 而不是新用户名。我在函数下面添加了 return 语句,但它仍然显示下面的 kotlin.unit.code
class EditProfile : AppCompatActivity() {
lateinit var binding: ActivityEditProfileBinding
lateinit var bindingProfileActivity: ActivityProfileBinding
lateinit var userProfileModel: UserModel
lateinit var currentUserId: String
lateinit var etUsername: String
override fun onCreate(savedInstanceState: Bundle?) {
binding = ActivityEditProfileBinding.inflate(layoutInflater)
bindingProfileActivity = ActivityProfileBinding.inflate(layoutInflater)
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(binding.root)
//firebaseAuth
currentUserId = FirebaseAuth.getInstance().currentUser?.uid!!
//get the username from the database
Firebase.firestore.collection("users")
.document(currentUserId)
.get()
.addOnSuccessListener { it ->
userProfileModel = it.toObject(UserModel::class.java)!!
//bind the username from the model to the EditText
val usernameFinal = userProfileModel.username
etUsername = binding.usernameField.setText(usernameFinal).toString()
}
//save the username when the user clicks on save
binding.savePfpButton.setOnClickListener {
saveUsername()
}//end oncreate fun
//update username method
private fun saveUsername(): String {
val updatedName: String = etUsername
val updatedProf = mapOf(
"username" to updatedName
)
//save the map in the document
Firebase.firestore.collection("users").document(currentUserId).update(updatedProf)
UiUtil.showToast(applicationContext, "Username updated")
return updatedName
}
}
}
当我尝试保存编辑后的用户名时,问题出现了,它显示 Kotlin.Unit 而不是新用户名。
由于声明了
Kotlin.Unit
变量,您将获得 etUsername
而不是新用户名:
lateinit var etUsername: String
数据的分配:
etUsername = binding.usernameField.setText(usernameFinal).toString()
以及
saveUsername()
函数的调用,您可以在其中使用:
val updatedName: String = etUsername
所以你现在正在做的,是通过分配
TextView#setText()返回的值来初始化
etUsername
,然后将其转换为 String
。由于此方法返回 Unit 类型的对象,因此 etUsername
字段将仅保存该对象的字符串表示形式,即“Unit”字符串。
如果你想将
usernameField
的更新值赋给usernameFinal
TextView,那么你只需要使用下面这行代码:
binding.usernameField.setText(usernameFinal)
它采用您从 Firestore 读取的
usernameFinal
值并将其设置为 TextView
字段。因此,您的活动中不需要额外的字段,例如 etUsername
。