如何使用kotlin在匕首中生成由@ContributesAndroidInjector组成的模块?
How to generate module consisting @ContributesAndroidInjector in dagger with kotlin?
我正在学习 dagger 2,现在我在 kotlin 上使用 dagger-2.25.4,我为下面给出的 dagger 创建了一个 BaseApplication class :
package com.example.demomvvm
import com.example.demomvvm.dagger.DaggerAppComponent
import dagger.android.AndroidInjector
import dagger.android.support.DaggerApplication
class MVVMApplication: DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication>? {
return DaggerAppComponent.builder().application(this).build()
}
}
这是我的 AppComponent class:
package com.example.demomvvm.dagger
import android.app.Application
import com.example.demomvvm.MVVMApplication
import dagger.BindsInstance
import dagger.Component
import dagger.android.AndroidInjector
import dagger.android.support.AndroidSupportInjectionModule
@Component(
modules = [
AndroidSupportInjectionModule::class,
ActivityBuilderModule::class
]
)
interface AppComponent: AndroidInjector<MVVMApplication> {
@Component.Builder
interface Builder{
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
我的 ActivityBuilderModule 没有被正确生成,这是我的 ActivityBuilderModule.kt:
package com.example.demomvvm.dagger
import com.example.demomvvm.ui.auth.LoginActivity
import dagger.Module
import dagger.Provides
import dagger.android.ContributesAndroidInjector
@Module
abstract class ActivityBuilderModule {
@ContributesAndroidInjector
abstract fun contributeLoginActivity(): LoginActivity
@Provides
fun doSomething(): String = "This is a string"
}
这是我在 Dagger 生成的代码中遇到的错误:
/home/suvodip/AndroidStudioProjects/demoMVVM/app/build/tmp/kapt3/stubs/debug/com/example/demomvvm/dagger/AppComponent.java:7: error: [Dagger/MissingBinding] java.lang.String cannot be provided without an @Inject constructor or an @Provides-annotated method.
public abstract interface AppComponent extends dagger.android.AndroidInjector<com.example.demomvvm.MVVMApplication> {
^
java.lang.String is injected at
com.example.demomvvm.ui.auth.LoginActivity.dagger
com.example.demomvvm.ui.auth.LoginActivity is injected at
dagger.android.AndroidInjector.inject(T) [com.example.demomvvm.dagger.AppComponent → com.example.demomvvm.dagger.ActivityBuilderModule_ContributeLoginActivity.LoginActivitySubcomponent]
我在这里注入:
package com.example.demomvvm.ui.auth
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import dagger.android.support.DaggerAppCompatActivity
import kotlinx.android.synthetic.main.activity_login.*
import javax.inject.Inject
class LoginActivity : DaggerAppCompatActivity(), AuthListener {
@Inject
lateinit var dagger: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("Dagger", "$dagger")
}
}
@SuvodipMondal 欢迎来到社区。
您收到的错误是因为 @Binds
和 @ContributesAndroidInjector
方法必须是抽象的,因为它们没有方法体。这意味着它们必须在接口或抽象 class 上进行。 @Provides
方法可以是静态的,这意味着它们可以继续抽象 classes 和 Java-8 编译接口,但非静态 ("instance") @Provides
方法不适用于抽象 classes。这在 Dagger FAQ "Why can’t @Binds
and instance @Provides
methods go in the same module?"
中明确列出
为实现此目的,您的摘要中必须有一个静态函数 class Annotated with @JvmStatic
你必须添加这个。
@Module
companion object{
@JvmStatic
@Provides
fun doSomething(): String = "This is a string"
}
那么你的class就会变成这样
package com.example.demomvvm.dagger
import com.example.demomvvm.ui.auth.LoginActivity
import dagger.Module
import dagger.Provides
import dagger.android.ContributesAndroidInjector
@Module
abstract class ActivityBuilderModule {
@ContributesAndroidInjector
abstract fun contributeLoginActivity(): LoginActivity
@Module
companion object{
@JvmStatic
@Provides
fun doSomething(): String = "This is a string"
}
}
更多参考 & 2
我正在学习 dagger 2,现在我在 kotlin 上使用 dagger-2.25.4,我为下面给出的 dagger 创建了一个 BaseApplication class :
package com.example.demomvvm
import com.example.demomvvm.dagger.DaggerAppComponent
import dagger.android.AndroidInjector
import dagger.android.support.DaggerApplication
class MVVMApplication: DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication>? {
return DaggerAppComponent.builder().application(this).build()
}
}
这是我的 AppComponent class:
package com.example.demomvvm.dagger
import android.app.Application
import com.example.demomvvm.MVVMApplication
import dagger.BindsInstance
import dagger.Component
import dagger.android.AndroidInjector
import dagger.android.support.AndroidSupportInjectionModule
@Component(
modules = [
AndroidSupportInjectionModule::class,
ActivityBuilderModule::class
]
)
interface AppComponent: AndroidInjector<MVVMApplication> {
@Component.Builder
interface Builder{
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
我的 ActivityBuilderModule 没有被正确生成,这是我的 ActivityBuilderModule.kt:
package com.example.demomvvm.dagger
import com.example.demomvvm.ui.auth.LoginActivity
import dagger.Module
import dagger.Provides
import dagger.android.ContributesAndroidInjector
@Module
abstract class ActivityBuilderModule {
@ContributesAndroidInjector
abstract fun contributeLoginActivity(): LoginActivity
@Provides
fun doSomething(): String = "This is a string"
}
这是我在 Dagger 生成的代码中遇到的错误:
/home/suvodip/AndroidStudioProjects/demoMVVM/app/build/tmp/kapt3/stubs/debug/com/example/demomvvm/dagger/AppComponent.java:7: error: [Dagger/MissingBinding] java.lang.String cannot be provided without an @Inject constructor or an @Provides-annotated method.
public abstract interface AppComponent extends dagger.android.AndroidInjector<com.example.demomvvm.MVVMApplication> {
^
java.lang.String is injected at
com.example.demomvvm.ui.auth.LoginActivity.dagger
com.example.demomvvm.ui.auth.LoginActivity is injected at
dagger.android.AndroidInjector.inject(T) [com.example.demomvvm.dagger.AppComponent → com.example.demomvvm.dagger.ActivityBuilderModule_ContributeLoginActivity.LoginActivitySubcomponent]
我在这里注入:
package com.example.demomvvm.ui.auth
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import dagger.android.support.DaggerAppCompatActivity
import kotlinx.android.synthetic.main.activity_login.*
import javax.inject.Inject
class LoginActivity : DaggerAppCompatActivity(), AuthListener {
@Inject
lateinit var dagger: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("Dagger", "$dagger")
}
}
@SuvodipMondal 欢迎来到社区。
您收到的错误是因为 @Binds
和 @ContributesAndroidInjector
方法必须是抽象的,因为它们没有方法体。这意味着它们必须在接口或抽象 class 上进行。 @Provides
方法可以是静态的,这意味着它们可以继续抽象 classes 和 Java-8 编译接口,但非静态 ("instance") @Provides
方法不适用于抽象 classes。这在 Dagger FAQ "Why can’t @Binds
and instance @Provides
methods go in the same module?"
为实现此目的,您的摘要中必须有一个静态函数 class Annotated with @JvmStatic
你必须添加这个。
@Module
companion object{
@JvmStatic
@Provides
fun doSomething(): String = "This is a string"
}
那么你的class就会变成这样
package com.example.demomvvm.dagger
import com.example.demomvvm.ui.auth.LoginActivity
import dagger.Module
import dagger.Provides
import dagger.android.ContributesAndroidInjector
@Module
abstract class ActivityBuilderModule {
@ContributesAndroidInjector
abstract fun contributeLoginActivity(): LoginActivity
@Module
companion object{
@JvmStatic
@Provides
fun doSomething(): String = "This is a string"
}
}
更多参考