6

我想在运行时使用 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);
    }

}

4

1 回答 1

1

消除@HiltViewModel

在您提到的链接中,一条评论指出

在 Dagger 2.31 中,可以在不使用 @HiltViewModel 并手动传递所有内容的情况下实现上述目标

我看到其余的实现已经完成,所以删除@HiltViewModel应该这样做。

于 2021-08-11T15:08:24.530 回答