英文:
Only safe call allowed error when EditText is used to send string to firebase in android studio
问题
我是新手使用 Firebase。我创建了一个简单的项目,该项目将用户输入的字符串发送到 Firebase 中的实时数据库。我使用了 EditText 视图来接收输入。以下是我的主要活动。username 是 EditText 视图的 ID。
package com.example.firebase
import...
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var database: DatabaseReference
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.Remote.setOnClickListener {
val name = binding.username.text.toString() //此行出现错误
database = FirebaseDatabase.getInstance().getReference("Users")
val User = User(name)
database.child(name).setValue(User).addOnSuccessListener {
binding.username.text.clear() //以及此行
Toast.makeText(this, "成功", Toast.LENGTH_SHORT).show()
}.addOnFailureListener {
Toast.makeText(this, "失败", Toast.LENGTH_SHORT).show()
}
}
}
}
构建后,在代码的注释行上显示以下错误:
只允许在 EditText 类型的可空接收器上进行安全 (?.) 或非空断言 (!!.) 调用。
如果我直接输入字符串而不使用 EditText 视图,则正常运行。有人能帮我解决这个问题吗?
英文:
I am new to Firebase. I have made a simple project which sends user strings to Realtime Database in Firebase. For input, I have used the EditText view. Here is my main activity. username is the id of EditText View
package com.example.firebase
import...
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var database: DatabaseReference
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.Remote.setOnClickListener {
val name = binding.username.text.toString() //Error on this line
database = FirebaseDatabase.getInstance().getReference("Users")
val User = User(name)
database.child(name).setValue(User).addOnSuccessListener {
binding.username.text.clear() //And This Line
Toast.makeText(this,"Sucess", Toast.LENGTH_SHORT).show()
}.addOnFailureListener {
Toast.makeText(this,"Failed", Toast.LENGTH_SHORT).show()
}
}
After Building following error is shown on the commented line of code:
> Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type EditText.
It works fine if I direct enter a string instead of using EditText View. Can someone help me with this?
答案1
得分: 2
只翻译代码部分:
- Use safe call (?.)
val name = binding.username?.text.toString()
- Use a non-null asserted (!!.)
val name = binding.username!!.text.toString()
英文:
It looks like your username
EditText object is null. So there are two ways in which you solve this problem:
-
Use safe call (?.)
val name = binding.username?.text.toString() // 👆
-
Use a non-null asserted (!!.)
val name = binding.username!!.text.toString() // 👆
See more info inside the Kotlin documentation regarding null safety.
答案2
得分: 0
你有不同版本的布局文件吗(例如,纵向/横向,小屏幕,不同的API级别等)?检查所有这些版本中是否都有一个ID为“username”的EditText - 如果在某些变体中缺少它,生成的绑定类将使该属性可为空,因为它可能不存在(取决于充气哪个版本的布局文件)。
英文:
Do you have different versions of that layout file (e.g. portrait/landscape, small screen, different API level etc)? Check you have an EditText
with an ID of username
in all of them - if it's missing from some variations, the generated binding class makes that property nullable, since it might not be present (depending on which version of the layout file was inflated)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论