Android kotlin 使用 ViewModelFactory 将动态 arguments/parameters 传递给 ViewModel
Android kotlin passing dynamic arguments/parameters to ViewModel with ViewModelFactory
为了为 ViewModel 传输额外的 arguments/parameters,我们使用了 ViewModelFactory。例如
ExtraParamsViewModelFactory(this.requireActivity().application, "some string value")
但是在创建 ViewModel 时,我无法动态更改 arguments/parameters
val myViewModel = ViewModelProvider(this, ExtraParamsViewModelFactory(this.requireActivity().application, "some string value")).get(SomeViewModel::class.java)
"some string value" 在 fragment/activity class 中被硬编码。在 "some string value" 中,我需要传递一个始终与 ViewModel 不同的日期。在该片段中,用户选择了一个日期,单击了按钮并将该日期作为 arguments/parameters 传递给 ViewModel。不适合这个 ViewModelFactory?
无需在 ViewModel 构造函数中传递参数。您所需要的只是 setter & warrper class 取决于您的用途。
我猜你的 ViewModel 会有这样的东西
data class CustomWrapper<T>(var value:T)
class VM : ViewModel(){
private val stringValue = CustomWrapper<String>("")
fun setNewStringValue(value:String){
stringValue.value = value
//TODO:: update stuff related to `stringValue`
}
}
然后在你的Activity/Fragment..中简单地称呼它..像这样
vm.setNewStringValue("new value")
为了为 ViewModel 传输额外的 arguments/parameters,我们使用了 ViewModelFactory。例如
ExtraParamsViewModelFactory(this.requireActivity().application, "some string value")
但是在创建 ViewModel 时,我无法动态更改 arguments/parameters
val myViewModel = ViewModelProvider(this, ExtraParamsViewModelFactory(this.requireActivity().application, "some string value")).get(SomeViewModel::class.java)
"some string value" 在 fragment/activity class 中被硬编码。在 "some string value" 中,我需要传递一个始终与 ViewModel 不同的日期。在该片段中,用户选择了一个日期,单击了按钮并将该日期作为 arguments/parameters 传递给 ViewModel。不适合这个 ViewModelFactory?
无需在 ViewModel 构造函数中传递参数。您所需要的只是 setter & warrper class 取决于您的用途。
我猜你的 ViewModel 会有这样的东西
data class CustomWrapper<T>(var value:T)
class VM : ViewModel(){
private val stringValue = CustomWrapper<String>("")
fun setNewStringValue(value:String){
stringValue.value = value
//TODO:: update stuff related to `stringValue`
}
}
然后在你的Activity/Fragment..中简单地称呼它..像这样
vm.setNewStringValue("new value")