Dagger2 viewModelFactory lateinit property has not been initialized

У некоторых пользователей возникают краши, в какой момент они происходят и по какой причине пока не понятно.

Logs (Firebase Crashlytics)

Fatal Exception: fu.p
lateinit property factory has not been initialized
com.its.yarus.base.BaseFragment.getFactory (BaseFragment.java:7)
com.its.yarus.ui.search.SearchTypeFragment$vm$3.invoke (SearchTypeFragment.java:1)
androidx.lifecycle.ViewModelLazy.getValue (ViewModelLazy.java:1)
com.its.yarus.ui.search.SearchTypeFragment.getVm (SearchTypeFragment.java:2)
com.its.yarus.ui.search.SearchTypeFragment.update$lambda-2 (SearchTypeFragment.java:5)
androidx.camera.camera2.internal.Camera2CameraControlImpl$$InternalSyntheticLambda$7$e9d410b43813df60e795612fb2f87f0233ac603a6d2ad492f8d3b620f6813f78$0.run$bridge (Camera2CameraControlImpl.java:5)

BaseFragment

abstract class BaseFragment: Fragment() {

    @Inject
    lateinit var uploadManager: UploadManager

    @Inject
    lateinit var factory: ViewModelFactory

    @Inject
    lateinit var ciceroneHolder: LocalCiceroneHolder

    abstract var fragmentName: String
}

BaseMainFragment

....
override fun onCreate(savedInstanceState: Bundle?) {
        YarusApp.component?.inject(this)
        super.onCreate(savedInstanceState)
    }

....

SearchTypeFragment

class SearchTypeFragment : BaseRecyclerFragment(), NotTopInset {

    override val vm by viewModels<SearchViewModel>(
            ownerProducer = { this },
            factoryProducer = { factory }
    )

    private val vmSearch by viewModels<SearchMainViewModel>(
            ownerProducer = { requireParentFragment() },
            factoryProducer = { factory }
    )
}

Цепочка наследования:

SearchTypeFragment (находится в viewPager) у  SearchFragment ->
BaseRecyclerFragment ->
BaseMainFragment ->
BaseFragment

при передачи переменной factory и происходит краш

ViewModelFactory

@Singleton
class ViewModelFactory @Inject constructor(private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>) :
    ViewModelProvider.Factory {

    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        val viewModelProvider = viewModels[modelClass]
            ?: throw IllegalArgumentException("model class $modelClass not found")
        return viewModelProvider.get() as T
    }
}

ViewModelModule

@Module
abstract class ViewModelModule {

    @Binds
    @Singleton
    internal abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
    
}

MainComponent

@Singleton
@Component(
    modules = [
        AndroidSupportInjectionModule::class,
        NetworkModule::class,
        RepositoryModule::class,
        ApplicationModule::class,
        ViewModelModule::class,
        RoomModule::class,
        NavigationModule::class,
        SocketModule::class,
        ServiceModule::class,
        ExoPlayerModule::class
    ]
)
interface MainComponent {

    fun inject(application: YarusApp)
    fun inject(activity: BaseActivity)
    fun inject(activity: OnBoardingActivity)
    fun inject(activity: SignInActivity)
    fun inject(fragment: BaseFragment)
    fun inject(fragment: BaseSignInFragment)
    fun inject(fragment: BaseOnboardingFragment)
    fun inject(fragment: BaseDialogFragment)
    fun inject(fragment: BaseMusicFragment)
    fun inject(service: CloudMessagingService)
    fun inject(service: PlayerService)
    fun inject(seance: SeanceBottomSheet)
    fun inject(seance: PlaceBottomSheet)
    fun inject(promo: PromoBottomSheet)
    fun inject(bottomSheet: BaseBottomSheetDialogFragment)

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

}

Application

class YarusApp : Application() {

override fun onCreate() {
        super.onCreate()
        component = DaggerMainComponent.builder().application(this).build()
        component?.inject(this)

    }

companion object {
        var component: MainComponent? = null
    }


}

Есть какие-нибудь идеи или предложения о том, как пофиксить эту проблему?


Ответы (0 шт):