【发布时间】: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<BaseApplication>和DaggerAppComponent.factory().create(this)而不是您的@Component.Builder interface Builder ...