当前位置: 首页 > 知识库问答 >
问题:

kotlin中的Dagger2编译问题

唐修能
2023-03-14

我正在尝试使用Dagger2学习依赖注入。我已经创建了很少的自定义范围和限定符。我已经创建了一个应用程序组件,我想在其中注入某些全局依赖项,我还创建了一个活动组件,它将基于活动上下文返回某些实例。

现在,当我试图在活动中注入全局实例时,我得到了如下错误:

@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class ActivityContext
@javax.inject.Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class ApplicationContext
@Scope
@Retention(AnnotationRetention.SOURCE)
annotation class ApplicationScope

ApplicationScope.kt

@Scope
@Retention(AnnotationRetention.SOURCE)
annotation class ApplicationScope

在注入活动类中使用的ActivityComponent.kt。

@ActivityScope
@Component(modules = arrayOf(ActivityModule::class), dependencies = arrayOf(FirebaseComponent::class))
interface ActivityComponent {
    fun inject(mainActivity: MainActivity)
}

用于注入应用程序类的FireBaseComponent.kt。

@ApplicationScope
@Component(modules = arrayOf(ApplicationModule::class, FirebaseAuthModule::class, NetworkModule::class))
interface FirebaseComponent {
    fun inject(app: FirebaseChatApp)
}

ActivityModule.kt

@Module
class ActivityModule(val activity : Activity) {
    var mActivityRef : WeakReference<Activity> ;
    init {
        mActivityRef = WeakReference<Activity>(activity)
    }

    @Provides
    @ActivityScope
    @ActivityContext
    public fun getActivityContext() : Context? = mActivityRef.get()

    @Provides
    @ActivityScope
    @ActivityContext
    public fun getActivityInstance() : Activity? = mActivityRef.get();


    @Provides
    @ActivityScope
    public fun getGlideActivityInstance(@ActivityContext context : Context?) : Glide {
        Log.i("activityModule", "Returning activity glide")
        return Glide.get(context);
    }

}

ApplicationModule.kt

@Module
class ApplicationModule(val app : FirebaseChatApp) {

    @ApplicationContext
    @ApplicationScope
    @Provides
    fun provideContext() : Context = app


    @ApplicationInstance
    @ApplicationScope
    @Provides
    fun provideApplication() : Application = app
}
@Module
class FirebaseAuthModule {

    @Provides
    @ApplicationScope
    public fun getFirebaseAuth() : FirebaseAuth = FirebaseAuth.getInstance()
}

NetworkModule.kt

@Module
class NetworkModule {

    @Provides
    @ApplicationScope
    public fun getGlideApplicationInstance(@ApplicationContext applicationContext: Context ) : Glide {
        return Glide.get(applicationContext);
    }
}

FirebaseChatapp.kt应用程序类

class FirebaseChatApp : Application() {

        val firebaseComponent: FirebaseComponent by lazy {
            DaggerFirebaseComponent
                    .builder()
                    .applicationModule(ApplicationModule(this))
                    .build()
        }

    @Inject
    lateinit var firebaseAuth : FirebaseAuth

    @Inject
    lateinit var glide : Glide


    override fun onCreate() {
        super.onCreate()
        firebaseComponent.inject(this)
        Log.i("application", "APP->Firebase Auth = " + firebaseAuth)
        Log.i("application", "APP->Glide = " + glide)
    }

    public fun getApplicationComponent() : FirebaseComponent = firebaseComponent;
}

所有活动的baseActivity.kt超级类

public abstract class BaseActivity : AppCompatActivity(){
    @Inject
    @ActivityScope
    protected lateinit var glide : Glide

    @Inject
    @ApplicationScope
    protected lateinit var firebaseAuth : FirebaseAuth //ERROR HERE

    protected val activityComponent: ActivityComponent by lazy {
        DaggerActivityComponent
                .builder()
                .activityModule(ActivityModule(this))
                .firebaseComponent((this.application as FirebaseChatApp).getApplicationComponent())
                .build()
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        injectComponent(activityComponent)
    }
     abstract fun injectComponent(activityComponent: ActivityComponent)
}
class MainActivity : BaseActivity() {


    override fun injectComponent(activityComponent: ActivityComponent) {
        activityComponent.inject(this)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)
    }
}

我应该做些什么来解决这个错误。以及DI的正确使用方式是什么。因为我是新手。我有点困惑。

共有1个答案

束研
2023-03-14

问题是,您试图使用组件依赖项,但您跳过了添加子作用域组件可以继承的规定方法。

@ApplicationScope
@Component(modules = arrayOf(ApplicationModule::class, FirebaseAuthModule::class, NetworkModule::class))
interface FirebaseComponent {
    fun firebaseAuth() : FirebaseAuth // <-- this is missing

    fun inject(app: FirebaseChatApp)
}
 类似资料:
  • 我是Android Studio的初学者,我希望主要活动是在java上而不是在kotlin上。我测试了一些可用的堆栈溢出解决方案,例如: Menu->Tools->Kotlin->将kotlin反编译到java 菜单>工具>Kotlin>显示Kotlin字节码 单击“反编译”按钮 复制java代码 并且总是禁用“反编译”按钮。

  • 在试图使用JDK9.0.1编译Maven项目时,我遇到了这个stacktrace,但没有给出太多解释: 带有maven-compiler-plugin 3.7.0的Maven 3.5.0 我正在执行mvn clean Install 不幸的是,源代码不是开源的,所以我不能随意分享 还没有module-info.Java文件,我只是尝试使用Java9编译一个项目 奇怪的是,如果我将源级别保留在1.8

  • 我发现了一个与构建使用C:\Windows\System32\CertenRoll.dll作为引用的应用程序有关的问题。 我已经有几个人在这里复制了它,我想在联系微软之前得到更多的信息。 我想我的问题是:有人能证实这一点吗,或者如果证实了,他们破坏了向后兼容性?

  • 嗨,当我尝试在下面的类中注入Doa接口时,我正在使用mvvm和dagger2 我的接口类

  • 我使用android Studio制作了一个静态编程语言MultiPlatform Mobile项目,导入SQLDelight后遇到以下错误: 我回答了这个问题,但他们提到的一切我都做对了。在一个文件一个文件地查看之后,我没有找到我在哪里声明了那个版本,于是我决定将我的项目与其中一个示例项目进行比较。 再次查看这些文件后,我发现我在我的应用程序等级中使用了SQLDelightVersion1.5.

  • 我试图使用scalapb从protobuf生成case类。但是,我目前编译错误。 我有我的scalapb。sbt如下: 还有,我的构建。sbt如下: 此外,我还创建了一个示例。原型文件如下: 现在,当我尝试时,我收到以下错误: 有人能帮我解决这个错误吗? 我对scalapb的版本也有点困惑。萨米特。scalapb(https://scalapb.github.io/sbt-settings.htm