我想在运行时使用 Hilt 为 ViewModel 提供一些依赖项。我遵循了 d.android.com this指导的解决方案。
@HiltViewModel
public class ViewViewModel extends ViewModel {
...
@AssistedFactory
public interface ViewViewModelFactory {
ViewViewModel create(@Assisted int version);
}
@AssistedInject
public ViewViewModel(ProfileRepository repository, @Assisted int version) {
mProfileRepository = repository;
}
}
@AndroidEntryPoint
public class CarFragment extends Fragment {
@Inject
ViewViewModel.ViewViewModelFactory mViewViewModelFactory;
...
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
ViewViewModel viewModel = mViewViewModelFactory.create(21);
}
}
但是,仍然收到构建错误ViewModel constructor should be annotated with @Inject instead of @AssistedInject.
我正在使用刀柄版本 2.38.1 和 AGP 版本 7.0.0。还尝试了一些早期版本(2.35、2.37)。
我也尝试过创建自己的工厂提供程序,但没有任何运气:
public class ViewViewModel extends ViewModel {
...
@AssistedFactory
public interface ViewViewModelFactory {
ViewViewModel create(@Assisted int version);
}
@AssistedInject
public ViewViewModel(ProfileRepository repository, @Assisted int version) {
mProfileRepository = repository;
}
public static ViewViewModel provideFactory(ViewViewModelFactory assistedFactory,
int version){
return new ViewViewModelFactoryProvider(assistedFactory,version).create(ViewViewModel.class);
}
public static class ViewViewModelFactoryProvider implements ViewModelProvider.Factory {
ViewViewModelFactory assistedFactory;
int version;
public ViewViewModelFactoryProvider(ViewViewModelFactory assistedFactory,
int version) {
this.assistedFactory = assistedFactory;
this.version = version;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
return (T) assistedFactory.create(version);
}
}
}
@AndroidEntryPoint
public class CarFragment extends Fragment {
@Inject
ViewViewModel.ViewViewModelFactory mViewViewModelFactory;
...
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
ViewViewModel viewModel = ViewViewModel.provideFactory(mViewViewModelFactory,21);
}
}