前言
本章是基于Dagger2.38.1源码去理解hilt源码,在理解hilt源码之前一定要对dagger的用法有一定深入的了解。
hilt我个人的理解是专门为Android设计的一款简化的Dagger。
所以我们虽然使用了hilt,它最终还是会为我们转换成一个Dagger,然后在由Dagger源码处理。
下面我们来看看具体内容。
hilt demo
以github上的一个Demo作为讲解案例。
-
在MyApplication、MainActivity、UserListFragment和UserDetailsFragment中加入入口注解;
@HiltAndroidApp class MyApplication : Application() {...} @AndroidEntryPoint class MainActivity : AppCompatActivity(R.layout.activity_main) @AndroidEntryPoint class UserListFragment : Fragment() {...} @AndroidEntryPoint class UserDetailsFragment : Fragment() {...}
-
在UserListViewModel和UserDetailsViewModule上加入@HiltViewModel注解;
@HiltViewModel class UserListViewModel @Inject constructor( private val userListRepository: UserListRepository ) : ViewModel() {...} @HiltViewModel class UserDetailsViewModel @Inject constructor( private val userDetailsRepository: UserDetailsRepository ) : ViewModel() {...}
-
完成以上两个步骤就可以使用注解了;
-
(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
生成注入方法
-
@HiltAndroidApp修饰的MyApplication生成注入方法:
@OriginatingElement( topLevelClass = MyApplication.class ) @GeneratedEntryPoint @InstallIn(SingletonComponent.class) public interface MyApplication_GeneratedInjector { void injectApplication(MyApplication myApplication); }
-
@AndroidEntryPoint修饰的MainActivity生成注入方法:
@OriginatingElement( topLevelClass = MainActivity.class ) @GeneratedEntryPoint @InstallIn(ActivityComponent.class) public interface MainActivity_GeneratedInjector { void injectMainActivity(MainActivity mainActivity); }
-
@AndroidEntryPoint修饰的UserListFragment生成注入方法:
@OriginatingElement( topLevelClass = UserListFragment.class ) @GeneratedEntryPoint @InstallIn(FragmentComponent.class) public interface UserListFragment_GeneratedInjector { void injectUserListFragment(UserListFragment userListFragment); }
-
@AndroidEntryPoint修饰的UserDetailsFragment生成注入方法:
@OriginatingElement( topLevelClass = UserDetailsFragment.class ) @GeneratedEntryPoint @InstallIn(FragmentComponent.class) public interface UserDetailsFragment_GeneratedInjector { void injectUserDetailsFragment(UserDetailsFragment userDetailsFragment); }
生成Component容器
-
SingleTonComponent节点:
@Component(modules = [