尝试使用 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