我正在尝试在我的Android项目中使用Dagger 2,项目是用Kotlin编写的。我按照Dagger 2 Android示例将Dagger 2应用于我的项目。
app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
applicationId "com.wj.kotlintest"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation ('com.android.support.test.espresso:espresso-core:3.0.1', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation 'com.google.dagger:dagger-android-support:2.11'
kapt 'com.google.dagger:dagger-compiler:2.11'
provided 'org.glassfish:javax.annotation:10.0-b28'
}
ApplicationSub.kt
@Singleton
@Component(modules = arrayOf(ActivityModule::class))
interface ApplicationSub {
fun inject(app: MyApplication)
}
ActivityModule.kt
@Module(subcomponents = arrayOf(MainActivitySub::class))
abstract class ActivityModule {
@Binds
@IntoMap
@ActivityKey(MainActivity::class)
abstract fun bindMainActivity(builder: MainActivitySub.Builder): AndroidInjector.Factory<out Activity>
}
MainActivitySub.kt
@Subcomponent
interface MainActivitySub : AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder : AndroidInjector.Builder<MainActivity>()
}
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
MyApplication.java
public class MyApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> activityInjector;
@Override
public void onCreate() {
super.onCreate();
DaggerApplicationSub
.create()
.inject(this);
}
@Override
public AndroidInjector<Activity> activityInjector() {
return activityInjector;
}
}
我的代码像这样,它可以运行,但是当我尝试将MyApplication.java转换为MyApplication.kt时,项目无法运行。
MyApplication.kt
class MyApplication: Application(), HasActivityInjector{
@Inject
lateinit var activityInjector: DispatchingAndroidInjector<Activity>
override fun onCreate() {
super.onCreate()
DaggerApplicationSub
.builder()
.build()
.inject(this)
}
override fun activityInjector(): AndroidInjector<Activity> {
return activityInjector
}
}
我可以构建成功的项目,而且文件DaggerApplicationSub已经存在,但当我尝试运行这个项目时,出现了编译错误:
Error:(5, 49) Unresolved reference: DaggerApplicationSub
Error:(24, 9) Unresolved reference: DaggerApplicationSub
我不知道如何解决这个问题,我的所有代码都在KotlinTest中,感谢您的帮助!