在我的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。
我不知道到底是什么问题,但是我用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)
}