【发布时间】:2021-12-09 16:21:09
【问题描述】:
我正在尝试理解 HILT,我正在创建一个示例项目,我习惯于创建模块和组件,但现在有了一个 Hilt,有 InstallIn(),也许我必须和他们一起玩和以前一样。例如,我习惯于为每个功能创建一个模块:
LoginModule(包含:ViewModel、活动/片段、数据源、用例等...) ProductModule(包含:ViewModel、活动/片段、数据源、用例等...)
从现在开始,我用刀柄创建了一个NetworkModule:
@Module
@InstallIn(ApplicationComponent::class)
object NetworkModule {
@Provides
fun provideRetrofit(httpClient: OkHttpClient): Retrofit =
Retrofit.Builder()
.baseUrl(BASE_URL)
.client(httpClient)
.build()
@Provides
fun provideOkHttpClient(
httpLoggingInterceptor: HttpLoggingInterceptor,
@ErrorInterceptorOkHttpClient errorInterceptor: Interceptor,
): OkHttpClient = OkHttpClient()
.newBuilder()
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(errorInterceptor)
.build()
@ErrorInterceptorOkHttpClient
@Provides
fun provideErrorInterceptor(): Interceptor = ErrorInterceptor()
@Provides
fun provideHttpLogginInterceptor(): HttpLoggingInterceptor {
val loggingInterceptor = HttpLoggingInterceptor()
loggingInterceptor.level = when {
BuildConfig.DEBUG -> HttpLoggingInterceptor.Level.BODY
else -> HttpLoggingInterceptor.Level.NONE
}
return loggingInterceptor
}
@Provides
fun provideMyService(retrofit: Retrofit): MyService =
retrofit.create(MyService::class.java)
}
然后我有了这个功能,或者说应用程序的一部分,它是我想从现在开始显示一些东西的主页,我已经创建了这个:
@Module
@InstallIn(FragmentComponent::class)
object MainActivityModule {
@Provides
fun proviceDataSource(
myService: MyService,
myMapper: MyMapper,
): MyDatasource = MyDatasourceImpl(myService, myMapper)
@Provides
fun provicesMyMapper(): MyMapper = MapperImpl()
}
在我的活动中,我添加了
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
在 Fragment 中,我什么都没有,也许这就是我做错的事情?
以及何时使用 ApplicationComponent SingletonComponent 等?
因为我使用的是 dagger(不是 dagger-android),所以我有一个 ComponentFactory,我将所有这些组件作为(LoginComponent,GoogleMapComponent,ReferalCodeComponent)所有这些都是一个功能(谈论多模块项目),我正在创建这些组件的工厂,现在使用 Hilt 的方式如何?
【问题讨论】:
-
这里有什么问题?有什么错误吗?
标签: android kotlin dagger dagger-hilt