【问题标题】:lateinit property providerFactory has not been initializedlateinit 属性 providerFactory 尚未初始化
【发布时间】:2019-12-12 06:31:13
【问题描述】:

我在我的项目中将 dagger 2 与 kotlin 一起使用,其中一个片段(照片片段)中出现“UninitializedPropertyAccessException”。

这里是代码

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

应用类

@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
    }
}

应用组件类

@Module
interface ActivityBuildersModule {

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

活动构建器模块

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

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

仪表板活动

@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)
    }
}

}

视图模型提供者

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)
}

//.....
}

我正在使用 navGraph 在仪表板活动中启动片段

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

同一项目的链接。

请告诉我如何解决此问题。

【问题讨论】:

  • 没有。我正在使用 android dagger,其中 di 方法与上述帖子中的方法不同。
  • 你在哪里打电话inject?正如该帖子的解决方案所示
  • 我不必使用注入,因为正如我之前提到的,我使用的是 Android Dagger。
  • 尝试在fun applicationInjector() 中使用@Component.Factory interface Factory : AndroidInjector.Factory&lt;BaseApplication&gt; 和DaggerAppComponent.factory().create(this) 而不是您的@Component.Builder interface Builder ...

标签: android kotlin


【解决方案1】:

您的 PhotosFragment 应该扩展 DaggerFragment,而不仅仅是 Fragment。另外,检查您的活动是否扩展了 DaggerAppCompatActivity,而不仅仅是 AppCompatActivity

【讨论】:

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