Android Hilt 将“辅助”参数传递给 ViewModel 构造函数

问题描述 投票:0回答:0

至于 2023,除了这种方式之外,是否有更好或更少的样板方法将辅助参数注入 ViewModel?

    class PlantDetailViewModel @AssistedInject constructor(
    plantRepository: PlantRepository,
    @Assisted private val savedStateHandle: SavedStateHandle,
    @Assisted private val plantId: String
) : ViewModel() {

    @AssistedFactory
    interface PlantDetailViewModelFactory {
        fun create(handle: SavedStateHandle, plantId: String): PlantDetailViewModel
    }

    companion object {
        fun provideFactory(
            assistedFactory: PlantDetailViewModelFactory,
            owner: SavedStateRegistryOwner,
            defaultArgs: Bundle? = null,
            plantId: String
        ): AbstractSavedStateViewModelFactory = object : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
            @Suppress("UNCHECKED_CAST")
            override fun <T : ViewModel?> create(key: String, modelClass: Class<T>, handle: SavedStateHandle): T {
                return assistedFactory.create(handle, plantId) as T
            }
        }
    }
}

并在 Fragment 中使用它作为

    @AndroidEntryPoint
class PlantDetailFragment : Fragment() {

    private val args: PlantDetailFragmentArgs by navArgs()

    @Inject
    lateinit var plantDetailViewModelFactory: PlantDetailViewModelFactory

    private val plantDetailViewModel: PlantDetailViewModel by viewModels {
        PlantDetailViewModel.provideFactory(plantDetailViewModelFactory, this, arguments, args.plantId)
    }
}
android mvvm android-viewmodel dagger-hilt
© www.soinside.com 2019 - 2024. All rights reserved.