Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Kotlin android livedata未在活动、viewmodel中工作_Kotlin_Mvvm - Fatal编程技术网

Kotlin android livedata未在活动、viewmodel中工作

Kotlin android livedata未在活动、viewmodel中工作,kotlin,mvvm,Kotlin,Mvvm,您好,我最近遇到了一个在livedata中无法进行观察的情况,所以我要问一个问题 这太基本了,但我不知道为什么不行,所以我需要你的帮助 如果你能教我一点,我将不胜感激 我的注册活动 class SignUpActivity : BaseKotlinActivity<ActivitySignUpBindingImpl, SignUpViewModel>() { override val layoutResourceId: Int get() = R.layout.activi

您好,我最近遇到了一个在livedata中无法进行观察的情况,所以我要问一个问题

这太基本了,但我不知道为什么不行,所以我需要你的帮助

如果你能教我一点,我将不胜感激

我的注册活动

class SignUpActivity : BaseKotlinActivity<ActivitySignUpBindingImpl, SignUpViewModel>() {

    override val layoutResourceId: Int get() = R.layout.activity_sign_up

    override val viewModel: SignUpViewModel by viewModel()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = DataBindingUtil.setContentView<ActivitySignUpBindingImpl>(this, layoutResourceId)

        binding.apply {
            lifecycleOwner = this@SignUpActivity
            signUpViewModel = viewModel
        }

        viewModel?.apply {
            signUpStep.observe(this@SignUpActivity, Observer {
                when (it) {
                    SignUpStep.SIGN_UP -> supportFragmentManager.beginTransaction().replace(R.id.fragment, SignUpFragment(), "SignUpFragment").commit()
                    SignUpStep.PASSWORD -> supportFragmentManager.beginTransaction().replace(R.id.fragment, SignUpPasswordFragment(), "SignUpPasswordFragment").commit()
                    SignUpStep.PHONE_CERTIFICATION -> supportFragmentManager.beginTransaction().replace(R.id.fragment, SignUpPhoneCertificationFragment(), "SignUpPhoneCertificationFragment").commit()
                    else -> Unit
                }
                Log.d("Test Checked1", "${signUpStep.value}")
            })
        }

    }
}
如果查看日志,可以看到moveStep正常更改。然后signUpSteop已正常更改,但由于屏幕未移动且日志未显示,因此不会在livedata的观察中接收到它

我只是想知道是代码错了还是怎么了。你能帮我吗


作为参考,signUpStep在片段中不断变化,而livedata在活动中不断被观察到。

你能发布更新viewModel的片段代码吗?我猜你的片段没有使用与活动相同的viewModel实例。嗨,lvan,它在我的片段中没有任何作用,既然活动正在观察ViewModel中的数据,我是否需要在片段中进行观察?这是一个简单的问题,因为我缺乏技能。不,您应该能够从片段更新viewModel,并将更改传播到所有侦听viewModel更改的人。我需要查看您的片段代码,以验证它使用的是与您的活动相同的ViewModel实例。感谢lvan,感谢您的建议,我能够解决它
private val _signUpStep = MutableLiveData<SignUpStep>(SignUpStep.SIGN_UP)
    val signUpStep: LiveData<SignUpStep>
        get() = _signUpStep

    fun moveStep(view: View, newSignUpStep: SignUpStep) {
        val oldSignUpStep = _signUpStep.value
        _signUpStep.value = newSignUpStep

        Log.d( "Test Checked","moveStep: $oldSignUpStep -> $newSignUpStep")
    }
Test Checked1: SIGN_UP
moveStep: SIGN_UP -> PASSWORD
moveStep: PASSWORD -> PASSWORD
moveStep: PASSWORD -> PASSWORD