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

Dagger2+Kotlin:lateinit属性appComponent尚未初始化

庄智
2023-03-14

我正在使用Dagger2来注入类依赖,比如Bellow。

    @Component(modules = [ContextModule::class, SuggestModule::class, RetrofitModule::class,
    TranslateModule::class, DatabaseModule::class, ViewModelModule::class, FragmentModule::class])
interface AppComponent {
    @Singleton
    fun inject(fragment: TranslateFragment)
    @Singleton
    fun inject(fragment: FavouriteFragment)
    @Singleton fun inject(fragment: TensesFragment)
    @Singleton
    fun inject(activity: TensesActivity)
    @Singleton
    fun inject(activity: MainActivity)

    @Singleton
    fun inject(translateViewModel: TranslateViewModel)
    @Singleton
    fun inject(favouriteViewModel: FavouriteViewModel)

    @Singleton
    fun inject(translateProvider: TranslateProvider)
}
class App : Application() {

    companion object{
        lateinit var appComponent: AppComponent
    }

    override fun onCreate() {
        super.onCreate()

        appComponent = DaggerAppComponent.builder()
            .contextModule(ContextModule(this))
            .suggestModule(SuggestModule(this))
            .retrofitModule(RetrofitModule())
            .translateModule(TranslateModule(TranslateProvider()))
            .databaseModule(DatabaseModule(DatabaseManager(this)))
            .viewModelModule(ViewModelModule())
            .fragmentModule(FragmentModule())
            .build()
    }
}
class MainActivity : AppCompatActivity {

    constructor(){
        App.appComponent.inject(this)
    }

    @Inject
    lateinit var translateFragment: TranslateFragment
}
class TranslateFragment : Fragment {

    @Inject
    constructor() {
        App.appComponent.inject(this)
    }

    @Inject
    lateinit var translateViewModel: TranslateViewModel
}
class TranslateViewModel : BaseObservable {

    @Inject
    constructor() {
        App.appComponent.inject(this)
    }

    @Inject
    lateinit var translateProvider: TranslateProvider
}
class TranslateProvider {

    @Inject
    constructor() {
        App.appComponent.inject(this)
    }

    @Inject
    lateinit var retrofitProvider: RetrofitProvider
}

但我在TranslateProvider.kt收到一个错误:

UninitializedPropertyAccessException:lateinit属性appComponent尚未初始化

我不明白,请帮帮我。

谢了!

共有1个答案

巫研
2023-03-14

我在:.TranslateModule(TranslateModule(TranslateProvider()))中创建了TranslateProvider的实例

TranslateProvider的构造函数调用appComponent时,但当时appComponent没有初始化。只需将其移出TranslateModule构造函数,如下所示:

之前:

@Module
class TranslateModule(private val translateProvider: TranslateProvider) {

    @Provides
    fun getTranslateProvider(): TranslateProvider {
        return translateProvider
    }

}

之后:

@Module
class TranslateModule {

    @Provides
    fun getTranslateProvider(): TranslateProvider {
        return TranslateProvider()
    }

}
 类似资料:
  • 我试图将ViewModelFactory注入到活动中,但它总是抛出同样的错误:lateinit属性ViewModelFactory尚未初始化。我找不到我可能做错了什么。请参阅上面我的类中的代码 AppComponent.kt TweetSentimentsApplication.kt

  • 我正在为DI与Dagger2的项目工作。我正在MVP架构中注入presenter。由于某种原因,当我构建应用程序时,它会出现错误:“LateInit property presenter has not been initialized”。我知道这意味着没有注射,但我不明白为什么。下面是我的代码: 应用程序类 家庭模块 AppComponent 房屋结构 如果需要任何关于代码的其他信息,请询问..

  • Json服务器数据显示,在使用retrofit2和rxjava2的android中,当参数传递给inteface时,会出现错误。 接口

  • 我不知道这是怎么回事 主要活动 我遇到了这个问题 2022-03-18 09:18:27.393 13874-13874/com。实例githubuser2 E/AndroidRuntime:致命异常:主进程:com。实例githubuser2,PID:13874 java。lang.RuntimeException:无法启动活动组件信息{com.example.githubuser2/com.e

  • 我有一个类,我注入到ViewModel ViewModel工厂,当在活动中的onCreate方法中初始化视图模型时,它说传递的值没有初始化。 下面是我的代码 我对Kotlin很陌生,所以尝试过调试,但在这个问题上卡住了。 这是Mainactive代码: 我的ViewModelFactory: 我的班级回购: 这是我收到的错误:

  • 我正在尝试使用Spring-boot+Vaadin创建一个web项目,并且希望使用spring-data-jpa和hibernate从PostgreSQL数据库中获取数据。 在我的Vaadin看来,我尝试自动连接我的服务类,但我总是得到null,而且eror堆栈跟踪没有告诉我原因。 数据库得我得配置: 视图和UI: pom.xml: 我的服务: 更新的解决方案: