至于 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)
}
}