3.基于Dagger2.38.1版本源码理解hilt注解-@HiltViewModel和@InstallIn处理

前言

主要讲解@HiltViewModel,用于修饰自定义ViewModel。

@DefaultComponent修饰的节点。

@InstallIn和@TestInstallIn、@Module、@EntryPoint和@EarlyEntryPoint和@GeneratedEntryPoint和@ComponentEntryPoint注解的处理。

@HiltViewModel注解

@HiltViewModel注解 修饰的ViewModel类给MVVM项目提供ViewModel实例。

@HiltViewModel注解使用规则

  1. 使用@HiltViewModel修饰的节点必须继承androidx.lifecycle.ViewModel;

  2. 使用@HiltViewModel修饰的节点的构造函数不允许使用@AssistedInject,如果使用了@Inject修饰,那么有且仅有一个@Inject修饰的构造函数,并且该@Inject修饰的构造函数不允许使用private修饰;

  3. @HiltViewModel修饰的节点如果是内部类,那么需要使用static修饰;

  4. @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;
}
  1. 参数@HiltViewModelMap.KeySet Set keySet依赖来源于KeyModule的provide方法;

  2. viewModelComponentBuilder来源于ViewModelComponent容器。

@InstallIn和@TestInstallIn、@Module、@EntryPoint和@EarlyEntryPoint和@GeneratedEntryPoint和@ComponentEntryPoint注解

使用规则如下

@InstallIn和@TestInstallIn、@Module、@

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值