尝试使用 MutableLiveData 值时出现 NullPointerException
NullPointerException when trying to use MutableLiveData value
这是我的视图模型
class ManualInputViewModel : ViewModel() {
var username: MutableLiveData<String>? = null
var password: MutableLiveData<String>? = null
fun onClickLogin(view: View){
view.context.toast(username?.value!!)
}
}
这是我的activity
class ManualInputActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var binding : ActivityManualInputBinding = DataBindingUtil.setContentView(this,R.layout.activity_manual_input)
var viewModel = ViewModelProviders.of(this).get(ManualInputViewModel::class.java)
binding.viewmodel = viewModel
binding.lifecycleOwner = this
}
}
这是我的 xml 编辑文本代码
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:inputType="text"
android:hint="Username"
android:drawableLeft="@drawable/ic_person_black_24dp"
android:text="@={viewmodel.username}"/>
我只想吐司用户名,但出现错误
kotlin.KotlinNullPointerException
在 com.aseemsalim.databindingpractice.ui.rubikscube.colorinput.ManualInputViewModel.onClickLogin(ManualInputViewModel.kt:15)
您必须初始化 LiveData 属性:
class ManualInputViewModel : ViewModel() {
var username = MutableLiveData<String>()
var password = MutableLiveData<String>()
fun onClickLogin(view: View){
view.context.toast(username.value)
}
}
首先,当您将 viewmodel 变量绑定到视图时,您应该像这样为该变量设置 getter 和 setter 方法。
fun getUsername():String
{
return username?.value!!//this is because username variable is MutableLiveData
}
fun setUsername(username:String?)
{
this.username.value=username //this is bcoz username variable is MutableLiveData
}
当你使用MutableLiveData
时你不能这样设置数据
android:text="@={viewmodel.username}"
因为 android:text
将 return 字符串并且您不能将 string
设置为 MutableLiveData
。您必须这样做 MutableLiveData.value=string
.
最后,当你声明时 livedata
你应该这样声明
var username = MutableLiveData<String>()
您因此而出错,并且您的 edittext
值无法分配给 viewmodel
中的 variable
。
这是我的视图模型
class ManualInputViewModel : ViewModel() {
var username: MutableLiveData<String>? = null
var password: MutableLiveData<String>? = null
fun onClickLogin(view: View){
view.context.toast(username?.value!!)
}
}
这是我的activity
class ManualInputActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var binding : ActivityManualInputBinding = DataBindingUtil.setContentView(this,R.layout.activity_manual_input)
var viewModel = ViewModelProviders.of(this).get(ManualInputViewModel::class.java)
binding.viewmodel = viewModel
binding.lifecycleOwner = this
}
}
这是我的 xml 编辑文本代码
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:inputType="text"
android:hint="Username"
android:drawableLeft="@drawable/ic_person_black_24dp"
android:text="@={viewmodel.username}"/>
我只想吐司用户名,但出现错误
kotlin.KotlinNullPointerException 在 com.aseemsalim.databindingpractice.ui.rubikscube.colorinput.ManualInputViewModel.onClickLogin(ManualInputViewModel.kt:15)
您必须初始化 LiveData 属性:
class ManualInputViewModel : ViewModel() {
var username = MutableLiveData<String>()
var password = MutableLiveData<String>()
fun onClickLogin(view: View){
view.context.toast(username.value)
}
}
首先,当您将 viewmodel 变量绑定到视图时,您应该像这样为该变量设置 getter 和 setter 方法。
fun getUsername():String
{
return username?.value!!//this is because username variable is MutableLiveData
}
fun setUsername(username:String?)
{
this.username.value=username //this is bcoz username variable is MutableLiveData
}
当你使用MutableLiveData
时你不能这样设置数据
android:text="@={viewmodel.username}"
因为 android:text
将 return 字符串并且您不能将 string
设置为 MutableLiveData
。您必须这样做 MutableLiveData.value=string
.
最后,当你声明时 livedata
你应该这样声明
var username = MutableLiveData<String>()
您因此而出错,并且您的 edittext
值无法分配给 viewmodel
中的 variable
。