为什么Dagger Factory方法不能像Builder那样起作用?

问题描述 投票:0回答:1

在我的Android项目和app模块中,有一个“登录”屏幕。我想通过匕首提供其视图模型。但是,尽管我在模块类中明确定义了如何生成它,但它始终为null。这是我的代码:

class AuthViewModel(
        private val firebaseAuth: FirebaseAuth,
        private val logger: Logger
) {

    ....

}

这是模块对象。

@Module
object AuthModule {

    @Provides
    @JvmStatic
    fun provideLogger(): Logger = getLogger() // It creates a Logger object forsure. I confirm it doesn't return null.

    @Provides
    @JvmStatic
    fun provideViewModel(firebaseAuth: FirebaseAuth, logger: Logger) = AuthViewModel(firebaseAuth, logger)

    @Provides
    @JvmStatic
    fun provideFirebaseAuth() = FirebaseAuth.getInstance()
}

这是组件

@FeatureScope
@Component(modules = [AuthModule::class])
interface AuthComponent {

    @Component.Factory
    interface Factory {
        fun create(
                @BindsInstance context: Context
        ): AuthComponent
    }

}

这是我将其注入活动的方式。

class AuthActivity : AppCompatActivity() {

    @Inject lateinit var vm: AuthViewModel
    @Inject lateinit var logger: Logger

    companion object {
        private val TAG = AuthActivity::class.java.simpleName

        fun startActivity(ctx: Context) {
            val intent = Intent(ctx, AuthActivity::class.java)
            ctx.startActivity(intent)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        DaggerAuthComponent.factory()
                .create(this)

        logger.logDebug("test") // <==== Crashes here because logger is null
    }
}

由于记录器为null,因此应用程序在上面标记的行崩溃。我调试了该应用程序,并注意到ViewModel也为null。

android dagger-2
1个回答
0
投票

我不知道到底是什么问题,但是我用Builder替换了Factory,并解决了我的问题。

欢迎您告诉我原始代码中的问题,我非常乐意接受您的回答。谢谢。

@FeatureScope
@Component(modules = [AuthModule::class])
interface AuthComponent {

    @Component.Builder
    interface Builder {
        fun build(): AuthComponent

        @BindsInstance fun activity(context: Context): Builder
    }

    fun inject(activity: AuthActivity)
}
© www.soinside.com 2019 - 2024. All rights reserved.