Почему метод Dagger Factory не работает как Builder? - PullRequest
0 голосов
/ 07 ноября 2019

В моем проекте 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.

1 Ответ

0 голосов
/ 07 ноября 2019

Я не знаю, в чем именно проблема, но я заменил Factory на Builder, и моя проблема исправлена.

Вы можете сказать мне, в чем проблема в моем исходном коде, и я буду более чем счастливпринять ваш ответ. Спасибо.

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

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

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

    fun inject(activity: AuthActivity)
}
...