现在我使用 viewModelFactory 来初始化片段中 viewModel 的参数。
class MyFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val binding = FragmentMyBinding.inflate(inflater)
binding.lifecycleOwner = this
val argument = MyFragmentArgs.fromBundle(requireArgument()).myArgument
val viewModelFactory = MyViewModelFactory(myArgument, application)
binding.viewModel = ViewModelProvider(
this, viewModelFactory).get(MyViewModel::class.java)
return binding.root
}
}
class MyViewModelFactory(
private val myArgument: MyArgument,
private val application: Application) : ViewModelProvider.Factory {
@Suppress("unchecked_cast")
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
return MyViewModel(myArgument, application) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
与 hilt 依赖注入方式相比,有没有办法直接将参数传递给 viewModel ?
是的。使用 Hilt,您可以完全抛弃工厂模式。
要注入参数,您可以使用@ViewModelInject
注释,并注入viewModel
在活动中您可以使用by viewModels()
方法来自androidx.activity
包裹。
这是一个例子。
产品视图模型.kt
import androidx.hilt.lifecycle.ViewModelInject
class ProductsViewModel @ViewModelInject constructor(
private val foo: Foo
private val bar: Bar
) : ViewModel()
产品活动.kt
@AndroidEntryPoint
class ProductsActivity : AppCompatActivity(){
val viewModel: ProductsViewModel by viewModels()
}
要查看实际效果,您可以结帐这个仓库 https://github.com/theapache64/nemo/tree/master/app/src/main/java/com/theapache64/nemo/feature/products.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)