1.基于Dagger2.38.1版本源码理解hilt注解 - 总结篇

前言

本章是基于Dagger2.38.1源码去理解hilt源码,在理解hilt源码之前一定要对dagger的用法有一定深入的了解。

hilt我个人的理解是专门为Android设计的一款简化的Dagger。
所以我们虽然使用了hilt,它最终还是会为我们转换成一个Dagger,然后在由Dagger源码处理。

下面我们来看看具体内容。

hilt demo

以github上的一个Demo作为讲解案例。

  1. 在MyApplication、MainActivity、UserListFragment和UserDetailsFragment中加入入口注解;

     @HiltAndroidApp
     class MyApplication : Application() {...}
    
     @AndroidEntryPoint
     class MainActivity : AppCompatActivity(R.layout.activity_main)
    
     @AndroidEntryPoint
     class UserListFragment : Fragment() {...}
    
     @AndroidEntryPoint
     class UserDetailsFragment : Fragment() {...}
    
  2. 在UserListViewModel和UserDetailsViewModule上加入@HiltViewModel注解;

     @HiltViewModel
     class UserListViewModel @Inject constructor(
         private val userListRepository: UserListRepository
     ) : ViewModel() {...}
    
     @HiltViewModel
     class UserDetailsViewModel @Inject constructor(
         private val userDetailsRepository: UserDetailsRepository
     ) : ViewModel() {...}
    
  3. 完成以上两个步骤就可以使用注解了;

  • (1) 例如上面的代码在UserListViewModel构造函数中使用userListRepository,依赖的是UserListRepository使用@Inject构造函数;

  • (2)UserListRepository使用@Inject构造函数的UserListService参数依赖于NetworkModule的provideApiService方法;等等,注解的使用和Dagger雷同。

  • (3)贴出DatabaseModule和NetworkModel代码:

     	@InstallIn(SingletonComponent::class)
     	@Module
     	object DatabaseModule {
     	    @Provides
     	    @Singleton
     	    fun provideAppDatabase(@ApplicationContext appContext: Context): UsersDatabase {
     	        return Room.databaseBuilder(
     	            appContext,
     	            UsersDatabase::class.java,
     	            "Users"
     	        ).fallbackToDestructiveMigration().build()
     	    }
     	
     	    @Provides
     	    fun provideChannelDao(usersDatabase: UsersDatabase): UsersDao {
     	        return usersDatabase.usersDao
     	    }
     	
     	}
    
     	@Module
     	@InstallIn(SingletonComponent::class)
     	object NetworkModule {
     	
     	    @Singleton
     	    @Provides
     	    fun provideOkHttpClient() = if (BuildConfig.DEBUG) {
     	        val loggingInterceptor = HttpLoggingInterceptor()
     	        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
     	        OkHttpClient.Builder()
     	            .addInterceptor(loggingInterceptor)
     	            .build()
     	    } else {
     	        OkHttpClient
     	            .Builder()
     	            .build()
     	    }
     	
     	    @Singleton
     	    @Provides
     	    fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit = Retrofit.Builder()
     	        .addConverterFactory(MoshiConverterFactory.create())
     	        .baseUrl("https://api.github.com/")
     	        .client(okHttpClient)
     	        .build()
     	
     	    @Provides
     	    @Singleton
     	    fun provideApiService(retrofit: Retrofit): UserListService =
     	        retrofit.create(UserListService::class.java)
     	
     	    @Provides
     	    @Singleton
     	    fun provideUserDetailsService(retrofit: Retrofit): UserDetailsService =
     	        retrofit.create(UserDetailsService::class.java)
     	
     	}
    

hilt demo生成Dagger demo

生成注入方法

  1. @HiltAndroidApp修饰的MyApplication生成注入方法:

     @OriginatingElement(
         topLevelClass = MyApplication.class
     )
     @GeneratedEntryPoint
     @InstallIn(SingletonComponent.class)
     public interface MyApplication_GeneratedInjector {
       void injectApplication(MyApplication myApplication);
     }
    
  2. @AndroidEntryPoint修饰的MainActivity生成注入方法:

     @OriginatingElement(
         topLevelClass = MainActivity.class
     )
     @GeneratedEntryPoint
     @InstallIn(ActivityComponent.class)
     public interface MainActivity_GeneratedInjector {
       void injectMainActivity(MainActivity mainActivity);
     }
    
  3. @AndroidEntryPoint修饰的UserListFragment生成注入方法:

     @OriginatingElement(
         topLevelClass = UserListFragment.class
     )
     @GeneratedEntryPoint
     @InstallIn(FragmentComponent.class)
     public interface UserListFragment_GeneratedInjector {
       void injectUserListFragment(UserListFragment userListFragment);
     }
    
  4. @AndroidEntryPoint修饰的UserDetailsFragment生成注入方法:

     @OriginatingElement(
         topLevelClass = UserDetailsFragment.class
     )
     @GeneratedEntryPoint
     @InstallIn(FragmentComponent.class)
     public interface UserDetailsFragment_GeneratedInjector {
       void injectUserDetailsFragment(UserDetailsFragment userDetailsFragment);
     }
    

生成Component容器

  1. SingleTonComponent节点:

      @Component(modules = [
     
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值