Android ViewModel初始化时出现StackOverflower错误

Android ViewModel初始化时出现StackOverflower错误,android,kotlin,viewmodel,Android,Kotlin,Viewmodel,我在ViewModel类初始化过程中遇到了一个奇怪的问题。我认为代码是解释这个问题的最好方法 在此之后,“我的所有视图模型”将被继承: abstract class BaseViewModel : ViewModel() { internal var args: Bundle? = null } 我让委托为fragment提供ViewModel,它自动从fragment加载参数 interface ViewModelFactoryProvider<VIEW_MODEL : Bas

我在ViewModel类初始化过程中遇到了一个奇怪的问题。我认为代码是解释这个问题的最好方法

在此之后,“我的所有视图模型”将被继承:

abstract class BaseViewModel : ViewModel() {
    internal var args: Bundle? = null
}
我让委托为fragment提供ViewModel,它自动从fragment加载参数

interface ViewModelFactoryProvider<VIEW_MODEL : BaseViewModel, BINDING : ViewDataBinding> : ReadOnlyProperty<ViewModelFragment<VIEW_MODEL, BINDING>, VIEW_MODEL> {

val viewModelFactory: ViewModelProvider.Factory

override fun getValue(thisRef: ViewModelFragment<VIEW_MODEL, BINDING>, property: KProperty<*>): VIEW_MODEL {
    return ViewModelProviders.of(thisRef, viewModelFactory).get(thisRef.viewModelClass).apply {
        thisRef.arguments?.let { thisRef.viewModel.args = it }
    }
  }
}

现在我不知道在哪里可以搜索循环依赖关系,以及它的原因是什么。请提供帮助。

这是由于在代理中计算其值时访问thisRef.viewModel造成的

您可以通过此通过
委托
viewModel
属性。也就是说,方法
getViewModel()
使用委托的
override-fun-getValue(..)
方法,委托依次在
thisRef.viewModel.args=it
中调用
getViewModel()
。圆圈在该点重新开始

你想要的大概是

override fun getValue(thisRef: ViewModelFragment<VIEW_MODEL, BINDING>, property: KProperty<*>): VIEW_MODEL {
    return ViewModelProviders.of(thisRef, viewModelFactory).get(thisRef.viewModelClass).apply {
        thisRef.arguments?.let { this.args = it }
    }
  }
}
override-fun-getValue(thisRef:ViewModelFragment,属性:KProperty):视图\模型{
返回ViewModelProviders.of(thisRef,viewModelFactory).get(thisRef.viewModelClass).apply{
thisRef.arguments?.let{this.args=it}
}
}
}

它不在试图创建的属性上设置参数,而是在从(…)的
ViewModelProviders.of返回的
ViewModel
上设置参数。get(…)

在将ViewModel传递到片段之前,是否有任何方法设置ViewModel?我想隐式地将片段参数传递给viewmodel。@KarolKulbaka您的(已修复)代码会这样做,不是吗?还有一个实际的viewmodels工厂,您可以覆盖它来完成viewmodels的预期准备工作:我一眼就看不到分辨率。它工作得很好;)
 java.lang.StackOverflowError: stack size 8MB
    at android.support.v4.app.Fragment.getContext(Fragment.java:683)
    at android.support.v4.app.Fragment.getViewModelStore(Fragment.java:327)
    at android.arch.lifecycle.ViewModelStores.of(ViewModelStores.java:60)
    at android.arch.lifecycle.ViewModelProviders.of(ViewModelProviders.java:104)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$DefaultImpls.getValue(ViewModelFactoryProvider.kt:15)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getValue(ViewModelFragment.kt:20)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getViewModel(ViewModelFragment.kt)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$DefaultImpls.getValue(ViewModelFactoryProvider.kt:16)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getValue(ViewModelFragment.kt:20)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getViewModel(ViewModelFragment.kt)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$DefaultImpls.getValue(ViewModelFactoryProvider.kt:16)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getValue(ViewModelFragment.kt:20)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getViewModel(ViewModelFragment.kt)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$DefaultImpls.getValue(ViewModelFactoryProvider.kt:16)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getValue(ViewModelFragment.kt:20)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getViewModel(ViewModelFragment.kt)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$DefaultImpls.getValue(ViewModelFactoryProvider.kt:16)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getValue(ViewModelFragment.kt:20)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getViewModel(ViewModelFragment.kt)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$DefaultImpls.getValue(ViewModelFactoryProvider.kt:16)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getValue(ViewModelFragment.kt:20)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getViewModel(ViewModelFragment.kt)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$DefaultImpls.getValue(ViewModelFactoryProvider.kt:16)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getValue(ViewModelFragment.kt:20)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getViewModel(ViewModelFragment.kt)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$DefaultImpls.getValue(ViewModelFactoryProvider.kt:16)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getValue(ViewModelFragment.kt:20)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getViewModel(ViewModelFragment.kt)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$DefaultImpls.getValue(ViewModelFactoryProvider.kt:16)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getValue(ViewModelFragment.kt:20)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getViewModel(ViewModelFragment.kt)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$DefaultImpls.getValue(ViewModelFactoryProvider.kt:16)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getValue(ViewModelFragment.kt:20)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getViewModel(ViewModelFragment.kt)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$DefaultImpls.getValue(ViewModelFactoryProvider.kt:16)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getValue(ViewModelFragment.kt:20)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getViewModel(ViewModelFragment.kt)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$DefaultImpls.getValue(ViewModelFactoryProvider.kt:16)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getValue(ViewModelFragment.kt:20)
    at pl.kulbaka.karol.unilang.tools.ViewModelFragment.getViewModel(ViewModelFragment.kt)
    at pl.kulbaka.karol.unilang.tools.viewmodel.ViewModelFactoryProvider$
override fun getValue(thisRef: ViewModelFragment<VIEW_MODEL, BINDING>, property: KProperty<*>): VIEW_MODEL {
    return ViewModelProviders.of(thisRef, viewModelFactory).get(thisRef.viewModelClass).apply {
        thisRef.arguments?.let { this.args = it }
    }
  }
}