简体   繁体   English

lateinit 属性 providerFactory 尚未初始化

[英]lateinit property providerFactory has not been initialized

I'm using dagger 2 with kotlin in my project where i'm getting "UninitializedPropertyAccessException" in one of the fragments(Photos Fragment).我在我的项目中使用带有 kotlin 的 dagger 2,我在其中一个片段(照片片段)中收到“UninitializedPropertyAccessException”。

here is the code这是代码

class BaseApplication : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
    return DaggerAppComponent.builder().application(this).build()
    }
} 

Application class应用类

@Singleton
@Component(
modules = [
    AppModule::class,
    AndroidSupportInjectionModule::class,
    ActivityBuildersModule::class
    ]
)
interface AppComponent : AndroidInjector<BaseApplication> {

@Component.Builder
interface Builder {
    @BindsInstance
    fun application(application: Application): Builder

    fun build(): AppComponent
    }
}

App Component class应用组件类

@Module
interface ActivityBuildersModule {

@DashboardScope
@ContributesAndroidInjector(
    modules = [
        DashboardActivityModule::class,
        DashboardViewModelsModule::class,
        FragmentsBuilderModule::class
       ]
   )
    fun provideDashboardActivity(): DashboardActivity
}

Activity Builders module活动构建器模块

@Module
class DashboardActivityModule {
     @DashboardScope
     @Provides
     fun provideDashboardApi(retrofit: Retrofit): DashboardApi {
         return retrofit.create(DashboardApi::class.java)
     }

    @DashboardScope
    @Provides
    fun provideAdapter(): PhotosRecyclerAdapter? {
        return PhotosRecyclerAdapter()
    }
}

Dashboard Activity仪表板活动

@Module
abstract class DashboardViewModelsModule {
    @Binds
    @IntoMap
    @ViewModelKey(PhotosViewModel::class)
    abstract fun bindAuthViewModel(photosViewModel: PhotosViewModel?): ViewModel?
}

ViewModelsModule视图模型模块

class ViewModelProviderFactory @Inject constructor(creators: Map<Class<out ViewModel>, Provider<ViewModel>>) : ViewModelProvider.Factory {

private val TAG = "ViewModelProviderFactor"

private var creators: Map<Class<out ViewModel>, Provider<ViewModel>> = creators

@NonNull
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    var creator: Provider<out ViewModel?>? = creators?.get(modelClass)
    if (creator == null) { // if viewmodel has not been created
        // loop through the allowable keys (aka allowed classes with the @ViewModelKey)
        for ((key, value) in creators) { //if it's allowed, set the Provider<ViewModel>
            if (modelClass.isAssignableFrom(key)) {
                creator = value
                break
            }
        }
    }

    //if this is not one of the allowed keys, throw exception
    requireNotNull(creator) { "unknown model class : $modelClass" }

    //return the provider
    return try {
        creator.get() as T
    } catch (e: Exception) {
        throw RuntimeException(e)
    }
}

}

Viewmodel provider视图模型提供者

class PhotosFragment : Fragment() {

private val TAG = "PhotosFragment"
private var viewModel: PhotosViewModel? = null

@Inject
lateinit var providerFactory: ViewModelProviderFactory

@Inject
lateinit var adapter: PhotosRecyclerAdapter

//...

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_item_list, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    viewModel = ViewModelProviders.of(this, providerFactory).get(PhotosViewModel::class.java)
}

//.....
}

I'm launching the fragment in Dashboard activity using navGraph我正在使用 navGraph 在仪表板活动中启动片段

PS: https://github.com/venki131/PhotosAlbum PS: https : //github.com/venki131/PhotosAlbum

link for the same project.同一个项目的链接。

please let me know how to fix this issue.请让我知道如何解决这个问题。

Your PhotosFragment should extend DaggerFragment, instead of just Fragment.您的 PhotosFragment 应该扩展 DaggerFragment,而不仅仅是 Fragment。 Also, check if your activity extends DaggerAppCompatActivity, instead of just AppCompatActivity另外,检查您的活动是否扩展了 DaggerAppCompatActivity,而不仅仅是 AppCompatActivity

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM