我在一个项目中工作,我需要用 Dagger 2 注入 Retrofit 对象。我搜索了信息,但我只能执行几个步骤,现在我不知道如何继续:
我的组件:
@Singleton
@Component(modules = arrayOf(NetworkModule::class))
interface NetworkComponent {
fun inject(foo: TheApplication)
}
Run Code Online (Sandbox Code Playgroud)
我的模块:
@Module
class NetworkModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl("https://api.chucknorris.io/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
}
}
Run Code Online (Sandbox Code Playgroud)
现在我看到我必须创建一个Classwho 扩展自Applicationfor initComponent并创建一个@Inject下一个:
class TheApplication: Application() {
override fun onCreate() {
super.onCreate()
val net: NetworkModule = Dagger...
}
}
Run Code Online (Sandbox Code Playgroud)
从理论上讲,当我把Dagger...它放在应该是DaggerNetworkComponent但我重建项目时仍然丢失。任何人都可以向我解释它的Application.class用途以及我如何继续?
如何实现一个ViewModelFactory来提供我的项目ViewModels及其对整个项目的依赖?
我正在使用Dagger并且我想要@inject一个Repository我的ViewModel所以我创建一个抽象模块,其中包含Map存储库类:
我的抽象模块:
@Module
abstract class RepositoryModule{
@Binds
@IntoMap
@ClassKey(RepositoryStatus::class)
abstract fun provideRepositoryStatus(repositoryStatus: RepositoryStatus): RepositoryStatus
}
Run Code Online (Sandbox Code Playgroud)
我的ViewModel模块包括RespositoryModule:
@Module(includes = [
RepositoryModule::class
])
abstract class ViewModelModule {
@Binds
@IntoMap
@ViewModelKey(MainViewModel::class)
abstract fun bindsMainViewModel(viewModel: MainViewModel): ViewModel
}
Run Code Online (Sandbox Code Playgroud)
我不知道它到底是如何工作的,Dagger 如何知道我有一张地图并且我将它与我的绑定ViewModel?因为我从来没有使用过这个方法。我在图表中包含了一张地图,因此我认为除非我调用它,否则它无法使用。