Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SavedStateHandleController.attachToLifecycle:已附加到lifecycleOwner_Android_Android Savedstate - Fatal编程技术网

Android SavedStateHandleController.attachToLifecycle:已附加到lifecycleOwner

Android SavedStateHandleController.attachToLifecycle:已附加到lifecycleOwner,android,android-savedstate,Android,Android Savedstate,我在使用非空构造函数的视图模型中使用。但是我得到一个非法的状态异常,说它已经附加到一个生命周期所有者(见下文)。当我使用SavedStateViewModelFactory时,它工作正常,但不支持非空构造函数,并且是最终类 TestStateAFragment class TestStateAFragment : Fragment() { companion object { fun newInstance() : TestStateAFragment {

我在使用非空构造函数的视图模型中使用。但是我得到一个非法的状态异常,说它已经附加到一个生命周期所有者(见下文)。当我使用
SavedStateViewModelFactory
时,它工作正常,但不支持非空构造函数,并且是最终类

TestStateAFragment

class TestStateAFragment : Fragment() {

    companion object {
        fun newInstance() : TestStateAFragment {
            val fragment = TestStateAFragment()
            val bundle = Bundle()
            bundle.putParcelable("arg_a", TestState.TestStateA)
            fragment.arguments = bundle
            return fragment
        }
    }

    private lateinit var viewModel : TestStateAViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val factory = TestStateAViewModelFactory(activity as SavedStateRegistryOwner)
        viewModel = ViewModelProviders.of(this, factory).get(TestStateAViewModel::class.java)
    }
}
TestStateAViewModel

class TestStateAViewModel(val savedStateHandle: SavedStateHandle) : ViewModel() {

    var countStateObserver : BehaviorRelay<Int> = BehaviorRelay.create<Int>()

    private var count : Int = 0
    set(value) {
        field = value
        savedStateHandle.set("count", field)
        countStateObserver.accept(field)
    }
    init {
        savedStateHandle.get<Int>("count")?.let {
            count = it
        }
    }

    fun incrementCount() {
        count += 1
    }

    fun decrementCount() {
        count -= 1
    }
}
有人能指出问题出在哪里吗?多谢各位

编辑:以下是针对此特定错误提出的问题的链接。这被标记为已修复,预计将于本周09/30-10/05发布。

此问题在ViewModel保存状态版本中已修复。
查找问题。

此问题是由新的SavedStateHandleController类引起的。它似乎已经添加到这个提交中:如果我没有错的话,这个提交是在版本1.0.0-alpha05中。该问题目前在此版本中仍然存在,对此有一个问题。@ashwinmahajan请链接issue@ZacSweers完成,添加到编辑中。
class TestStateAViewModelFactory(
    savedStateRegistryOwner: SavedStateRegistryOwner,
    bundle : Bundle? = null
) : AbstractSavedStateViewModelFactory(savedStateRegistryOwner, bundle) {

    override fun <T : ViewModel?> create(
        key: String,
        modelClass: Class<T>,
        handle: SavedStateHandle
    ): T {
        return TestStateAViewModel(handle) as T
    }
}
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.lifecycleviewmodel, PID: 14295
    java.lang.IllegalStateException: Already attached to lifecycleOwner
        at androidx.lifecycle.SavedStateHandleController.attachToLifecycle(SavedStateHandleController.java:43)
        at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:67)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:177)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:145)
        at com.example.lifecycleviewmodel.fragment.states.a.TestStateAFragment.onCreate(TestStateAFragment.kt:47)
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2586)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:838)
        at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1197)
        at androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1080)
        at androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:119)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1866)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2663)
        at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManagerImpl.java:2613)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:246)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:542)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
        at com.example.lifecycleviewmodel.TestActivity.onStart(TestActivity.kt:34)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1470)
        at android.app.Activity.performStart(Activity.java:7170)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3071)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1916)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6898)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)