我是使用Dagger2的新手(我一直使用Koin),我正在尝试实现一个简单的示例,但我真的不知道我缺少了什么。这就是我目前得到的。
app.gradle:
ext.daggerVersion = '2.23.2'
implementation "com.google.dagger:dagger:$daggerVersion"
implementation "com.google.dagger:dagger-android-support:$daggerVersion"
kapt "com.google.dagger:dagger-android-processor:$daggerVersion"
kapt "com.google.dagger:dagger-compiler:$daggerVersion"
应用模块。kt:
@Module
class AppModule {
@Provides
@Singleton
fun provideApplication(app: App): Application = app
@Provides
@Singleton
fun provideTestOperator(testOperator: TestOperator) = testOperator
@Provides
@Singleton
fun provideTestClass(testClass: TestClass) = testClass
}
AppComponent。kt:
@Singleton
@Component(modules = [
AndroidInjectionModule::class,
AppModule::class
])
interface AppComponent : AndroidInjector<App> {
@Component.Builder
interface Builder {
@BindsInstance
fun application(app: App): Builder
fun build(): AppComponent
}
}
TestClass。千吨
class TestClass @Inject constructor(private val testOperator: TestOperator) {
fun getRandomValueFromCTest(): Int = testOperator.generateRandomNumber()
}
class TestOperator @Inject constructor() {
fun generateRandomNumber(): Int = Random.nextInt()
}
pp.kt:
class App : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder().application(this@App).build()
}
}
MainActivity.kt:
class MainActivity : AppCompatActivity() {
@Inject
lateinit var testClass: TestClass
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onResume() {
super.onResume()
val x = testClass.getRandomValueFromCTest()
}
}
错误:testClass==null
MainActivity应该扩展DaggerActivity,而不是AppCompatActivity
您错过了实际的注入调用。
class MainActivity : AppCompatActivity() {
@Inject
lateinit var testClass: TestClass
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
应用模块。kt:提供应用程序上下文。不需要为测试*类编写@singleton@provides(看看原因)
@Module
class AppModule {
@Provides
@Singleton
fun provideApplication(app: App): Context = app.applicationContext
}
AppComponent。kt:。生成器已弃用IIRC。使用组件。工厂。并用AndroidSupportInjectionModule::class替换AndroidInjectionModule::class,因为我们使用的是dagger android support和android的Compat。请参阅此处名为ActivityModule::class的新模块。
@Singleton
@Component(modules = [
ActivityModule::class
AndroidSupportInjectionModule::class,
AppModule::class
])
interface AppComponent : AndroidInjector<App> {
@Component.Factory
abstract class Factory : AndroidInjector.Factory<App>
}
TestClass。千吨
@Singleton
class TestClass @Inject constructor(private val testOperator: TestOperator) {
fun getRandomValueFromCTest(): Int = testOperator.generateRandomNumber()
}
@Singleton
class TestOperator @Inject constructor() {
fun generateRandomNumber(): Int = Random.nextInt()
}
pp.kt:从@Component开始使用工厂而不是构建器。构建器
已弃用。
class App : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.factory().create(this)
}
}
活动模块。kt:为dagger提供一个模块来创建你的活动。
@Module
interface ActivityModule {
@ContributesAndroidInjector
fun provideMainActivity(): MainActivity
}
主要活动。kt:最后,从DaggerAppCompatActivity扩展。
class MainActivity : DaggerAppCompatActivity() {
@Inject
lateinit var testClass: TestClass
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onResume() {
super.onResume()
val x = testClass.getRandomValueFromCTest()
}
}
我认为这应该没有问题。如需更多参考,您可以查看此示例和新的更简单的docs at dagger。开发/Android
本文向大家介绍Android 简单实现一个流式布局的示例,包括了Android 简单实现一个流式布局的示例的使用技巧和注意事项,需要的朋友参考一下 本篇文章主要介绍了Android 简单实现一个流式布局的示例,分享给大家,具体如下: 流式布局应该是我们很常见的一种布局了,在很多场景下都会遇到它,例如:标签之类的功能等。用轮子不如造轮子来的爽,这里自己简单的实现下流式布局: onMeasure on
本文向大家介绍如何简单的实现一个promise?相关面试题,主要包含被问及如何简单的实现一个promise?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先明确什么是promiseA+规范,参考规范的地址:primise A+规范 如何实现一个promise,参考我的文章: 实现一个完美符合Promise/A+规范的Promise 一般不会问的很详细,只要能写出上述文章中的v1.0版本
本文向大家介绍利用PHP实现一个简单的用户登记表示例,包括了利用PHP实现一个简单的用户登记表示例的使用技巧和注意事项,需要的朋友参考一下 一、展示单行的用户信息表 首先我们需要创建两个文件,一个为html文件,一个为php文件。 这里博主就创建了form.html和formHandle.php两个文件。 下面展示一下两个文件的内容: form.html的文件内容: 效果展示: 这里要注意的是:类
本文向大家介绍jQuery实现的简单分页示例,包括了jQuery实现的简单分页示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了jQuery实现的简单分页。分享给大家供大家参考,具体如下: PS:这里再为大家推荐几款代码格式化、美化工具,相信大家在以后的开发过程中会用得到: 在线JavaScript代码美化、格式化工具: http://tools.jb51.net/code/js Jav
本文向大家介绍JSP实现的简单分页示例,包括了JSP实现的简单分页示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JSP实现的简单分页示例。分享给大家供大家参考,具体如下: 希望本文所述对大家JSP程序设计有所帮助。
本文向大家介绍jQuery实现一个简单的轮播图,包括了jQuery实现一个简单的轮播图的使用技巧和注意事项,需要的朋友参考一下 html代码: css代码: js代码: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!