wafflestudio / seminar-2021

2021 Rookies 세미나
47 stars 110 forks source link

observe가 실행이 안됩니다... #364

Closed Whiteppanda closed 3 years ago

Whiteppanda commented 3 years ago

***kotlin //MainActivitiy.kt에서

private lateinit var binding: ActivityMainBinding
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    binding.imageButton1.setOnClickListener{//just do it
        viewModel.changeState(0)
        it.isClickable = false
    }
    viewModel.lst.observe(this,{
        val myToast: Toast = Toast.makeText(this.applicationContext,"here",Toast.LENGTH_SHORT)
        myToast.show()
        viewModel.judgeNow()
        viewModel.changeText()
        binding.textView.text = viewModel.text.value
    })

//MainViewBinding.kt 에서

class MainViewModel: ViewModel() {
    private val _lst = MutableLiveData<MutableList<Int>>(mutableListOf(0, 0, 0, 0, 0, 0, 0, 0, 0))
    var lst : LiveData<MutableList<Int>> = _lst
    private val _state = MutableLiveData<Int>(0)//state of game
    fun changeState(i: Int){//순서와 버튼의 상태를 변경한다.
        Timber.d("clicked button")
        _order.value = _order.value != true
        if(_order.value == true){//o
            _lst.value?.removeAt(i)
            _lst.value?.add(i,1)

        }
        else{//x
            _lst.value?.removeAt(i)
            _lst.value?.add(i,2)
        }
    }

observe에 있는 toast가 처음 실행할때 한번 뜨고 그 이후로 버튼을 눌러도 뜨지 않습니다. observe가 안된다고 생각할 수 밖에 없는데 왜 이러는 걸까요.. 제가 view binding, livedata 선언은 몇번을 봐도 틀리지 않은 것 같은데 도저히 모르겠습니다...

veldic commented 3 years ago

https://developer.android.com/topic/libraries/architecture/livedata#update_livedata_objects

위 링크 참고해주시면 postValue() 혹은 setValue()를 통해야만 observe에서 반응할 수 있다는 걸 알 수 있습니다. Kotlin에서 setValue().value를 통한 접근으로 표현되므로 _lst.value의 변화가 필요합니다.

Whiteppanda commented 3 years ago

https://developer.android.com/topic/libraries/architecture/livedata#update_livedata_objects

위 링크 참고해주시면 postValue() 혹은 setValue()를 통해야만 observe에서 반응할 수 있다는 걸 알 수 있습니다. Kotlin에서 setValue().value를 통한 접근으로 표현되므로 _lst.value의 변화가 필요합니다.

_lst.value의 변화라고 하시면 위에서 fun을 통한 _lst.value?.add(i)는 _lst의 변화가 아닌건가요?

veldic commented 3 years ago

https://developer.android.com/topic/libraries/architecture/livedata#update_livedata_objects 위 링크 참고해주시면 postValue() 혹은 setValue()를 통해야만 observe에서 반응할 수 있다는 걸 알 수 있습니다. Kotlin에서 setValue().value를 통한 접근으로 표현되므로 _lst.value의 변화가 필요합니다.

_lst.value의 변화라고 하시면 위에서 fun을 통한 _lst.value?.add(i)는 _lst의 변화가 아닌건가요?

~~_lst.value?.add(i)는 MutableList 내부의 변화이지 MutableLiveData 내부(value)의 변화가 아닙니다. observe가 작동하기 위해서는 MutableLiveData의 변화가 필요합니다.~~

문서를 확인해보시면

라고 적혀있습니다. _lst.setValue() 혹은 _lst.postValue() 만이 observers를 trigger할 수 있음을 뜻하며 _lst.setValue()가 kotlin에서 _lst.value = ~~로 표현됩니다.

woohm402 commented 3 years ago

@Whiteppanda 해결되셨나요?