我目前正在尝试使用InstantApps,并希望将dagger包含在我的项目中。
我在设置应用AppComponent时遇到了问题。我的应用程序组件包括我的应用程序的所有功能匕首模块。
我基本上有:
我在添加Instant App模块之前试图找出设置。
来自InstantApps文档和项目示例。似乎Application类需要在Base中。从Dagger文档,到设置匕首:
DaggerYourAppComponent.create().inject(this);
应包含在您的应用程序类中。但是,这似乎是不可能的,因为AppComponent需要引用所有功能匕首模块。
我的问题是:
谢谢
答案 0 :(得分:12)
以下是使用Instant应用程序注入Dagger2的示例代码,以使事情更加清晰。 https://github.com/willowtreeapps/android-instant-apps-demo
答案 1 :(得分:2)
我写了一篇关于此的文章,其中包含许多细节:Dagger2 for Modular Architecture,但是简短的回答。
您必须以不同的方式使用Dagger2。您不需要为每个要素模块使用模块或子组件,而是需要使用与基础AppComponent具有依赖关系的组件。
在单个模块中,我们通常会这样做:
@Singleton
@Component(modules = arrayOf(NetworkModule::class, RepositoryModule::class,
SubcomponentModule::class))
interface ApplicationComponent : AndroidInjector<MyApplication> {
val userRepository: UserRepository
val apiService: ApiService
}
@Module
object NetworkModule {
@Provides
@Singleton
@JvmStatic
fun provideApiService(okHttp: OkHttp): ApiService {
return ApiSerive(okHttp)
}
}
但正如您所说,您无法访问可能位于另一个模块中的SubComponentModule或另一个功能模块中的参考dagger模块。
您可以在功能模块中创建一个新的匕首模块,具体取决于ApplicationComponent,如下所示:
@Browser
@Component(modules = [(BrowserModule::class)],
dependencies = [(AppComponent::class)])
interface BrowserComponent : AndroidInjector<AppCompatActivity> {
@Component.Builder
abstract class Builder: AndroidInjector.Builder<AppCompatActivity>(){
/**
* explicity declare to Dagger2
* that this builder will accept an AppComponent instance
**/
abstract fun plus(component: AppComponent): Builder
}
}
相应的功能活动将构建组件:
class BrowserActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
DaggerBrowserComponent
.builder()
/**
* we have to provide an instance of the AppComponent or
* any other dependency for this component
**/
.plus((application as MyApplication).component)
.build()
.inject(this)
}
}