前言
主要讲解@HiltViewModel,用于修饰自定义ViewModel。
@DefaultComponent修饰的节点。
@InstallIn和@TestInstallIn、@Module、@EntryPoint和@EarlyEntryPoint和@GeneratedEntryPoint和@ComponentEntryPoint注解的处理。
@HiltViewModel注解
@HiltViewModel注解 修饰的ViewModel类给MVVM项目提供ViewModel实例。
@HiltViewModel注解使用规则
-
使用@HiltViewModel修饰的节点必须继承androidx.lifecycle.ViewModel;
-
使用@HiltViewModel修饰的节点的构造函数不允许使用@AssistedInject,如果使用了@Inject修饰,那么有且仅有一个@Inject修饰的构造函数,并且该@Inject修饰的构造函数不允许使用private修饰;
-
@HiltViewModel修饰的节点如果是内部类,那么需要使用static修饰;
-
@HiltViewModel修饰的节点不允许使用@Scope修饰的注解修饰。
@HiltViewModel注解修饰节点生成代码
生成$CLASS_HiltModules类。
demo:
@HiltViewModel
class UserListViewModel @Inject constructor(
private val userListRepository: UserListRepository
) : ViewModel() {...}
UserListViewModel生成UserListViewModel_HiltModules类:
@OriginatingElement(
topLevelClass = UserListViewModel.class
)
public final class UserListViewModel_HiltModules {
private UserListViewModel_HiltModules() {
}
@Module
@InstallIn(ViewModelComponent.class)
public abstract static class BindsModule {
private BindsModule() {
}
@Binds
@IntoMap
@StringKey("com.aregyan.github.views.userList.UserListViewModel")
@HiltViewModelMap
public abstract ViewModel binds(UserListViewModel vm);
}
@Module
@InstallIn(ActivityRetainedComponent.class)
public static final class KeyModule {
private KeyModule() {
}
@Provides
@IntoSet
@HiltViewModelMap.KeySet
public static String provide() {
return "com.aregyan.github.views.userList.UserListViewModel";
}
}
}
我们再去看ActivityComponent容器:
@subComponent
@ActivityScoped
public static abstract class ActivityComponent
implements
MainActivity_GeneratedInjector
{
//MainActivity_GeneratedInjector中的方法
//void injectMainActivity(MainActivity mainActivity);
InternalFactoryFactory getHiltInternalFactoryFactory();
ViewModelComponent.Builder getViewModelComponentBuilder();
FragmentComponent.Builder fragmentComponentBuilder();
@SubComponent.Builder
static interface Builder{
Builder activity(
@BindsInstance
Activity activity);
ActivityComponent build();
}
}
getHiltInternalFactoryFactory通过Injec修饰InternalFactoryFactory构造函数获取依赖:
@Inject
InternalFactoryFactory(
Application application,
@HiltViewModelMap.KeySet Set<String> keySet,
ViewModelComponent.Builder viewModelComponentBuilder) {
this.application = application;
this.keySet = keySet;
this.viewModelComponentBuilder = viewModelComponentBuilder;
}
-
参数@HiltViewModelMap.KeySet Set keySet依赖来源于KeyModule的provide方法;
-
viewModelComponentBuilder来源于ViewModelComponent容器。
@InstallIn和@TestInstallIn、@Module、@EntryPoint和@EarlyEntryPoint和@GeneratedEntryPoint和@ComponentEntryPoint注解
使用规则如下
@InstallIn和@TestInstallIn、@Module、@