【问题标题】:@Inject lateinit property has not been initialized Dagger2@Inject lateinit 属性尚未初始化 Dagger2
【发布时间】:2020-01-03 10:21:36
【问题描述】:

我尝试在我的项目中使用 Dagger2。我有一个 Firebase 服务和一个名为 SyncFactory 的类,它发出一个特定的请求。当我接到 Firebase 的电话时,我提出了我的请求。 我创建了一个经理模块

@Module(includes = [RepositoryModule::class, NetworkModule::class, AppModule::class])
class ManagersModule {
...
    @Singleton
    @Provides
    fun provideSyncFactory(context: Context, accountsRepository: AccountsRepository, messagesRepository: MessagesRepository) : SyncFactory {
        return SyncFactory(context, accountsRepository, messagesRepository)
    }
...

}

SyncFactory 类如下所示

class SyncFactory @Inject constructor(
    private val context: Context,
    private val accountsRepository: AccountsRepository,
    private val messagesRepository: MessagesRepository
) {

fun getAccounts(){....}

我也有一个界面

@Singleton
@Component(modules = [ViewModelsModule::class, DatabaseModule::class, RepositoryModule::class, AppModule::class, NetworkModule::class, ManagersModule::class])
interface ViewModelComponent {
    fun inject(viewModels: ViewModels)

    fun inject(firebaseService: AppFirebase)
}

最后在我的 firebase 服务中,我注入了 SyncFactory

class AppFirebase : FirebaseMessagingService(), SyncFactoryCallback {

    @Inject
    lateinit var syncFactory: SyncFactory


override fun onMessageReceived(message: RemoteMessage) {
    super.onMessageReceived(message)

    // lateinit property syncFactory has not been initialized
    syncFactory.getAccounts()

}

当我的服务被调用时,我得到一个 lateinit 属性 syncFactory has not been initialized 异常。 我做错了什么..?

【问题讨论】:

  • 你不要用 DaggerViewModelComponent 注入你的服务
  • 如果您使用@Singleton class SyncFactory @Inject constructor(,那么您可以完全删除provideSyncFactory。否则,您应该使用@Binds 而不是@Provides 使其成为@Singleton
  • 我不注入我的服务是什么意思?我是新手……你能解释一下吗?
  • 你在 AppFirebase 中缺少yourComponentInstance.inject(this)(可能最好的地方是它的onCreate

标签: android kotlin dependency-injection dagger-2 kotlin-lateinit


【解决方案1】:

解决方案是在您的 Application 类中实现 HasServiceInjector


class MyApplication : Application(), HasServiceInjector {

    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Service>


    companion object {
        private lateinit var instance: MyApplication

    }


    override fun serviceInjector(): AndroidInjector<Service> {
        return dispatchingAndroidInjector
    }
}


【讨论】:

    猜你喜欢
    • 2020-09-23
    • 2023-03-25
    • 2017-03-03
    • 1970-01-01
    • 2020-12-31
    • 2021-06-11
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多