공부/Android

[Compose] 데이터를 부르는 방법에 대한 고민

데자와 맛있다 2023. 8. 13. 04:12

100% 컴포즈 사용하는 프로젝트 진행중이다

컴포즈 예시로 올라온 자료가 있긴하지만 일단 내맘대로 하고있다

하면서 여러 고민이 있는데 하다가 까먹고 또 똑같은 고민을 하고있어서 걍 써보기로했다

그냥 내 고민이라서.. 결론은 없는 글이 될것이다

 

그니깐 mvvm패턴을 적용해서 하는데 그러면 레포지토리가 있을거고 걔한테서 viewmodel이 값달라고 요청을 할건데

그 값 달라고 요청을 어디서 해야될까?

 

compose는 state가 변경되면 composable함수 안에 있는 애들을 실행한다

그래서 아무 생각없이

이렇게 그냥 컴포저블 함수 안에 viewmodel에 있는 값 업데이트 함수를 불러버리면

처음 화면 불러올때 api요청하고 그담에 화면 리컴포저블될때 또 api요청을 하게된다

뒤로가기 할때도 한번 더 불리더라..  화면을 없앨때도 저게 실행이 되는건가?

그리고 깜~~~~빡 잘못하면 무한 반복이 생길수도있다

위 처럼 컴포즈에서도 이벤트를 한번 적용해보자 ㅋ.ㅋ 이러면서 만들고 테스트를 위해서 인터넷 연결 다 끄고 실행했는데

토스트 메시지가 안없어졌다

그래서 로그 찍어보니 무한히 반복되고있었다...............

이유는 잘 모르겟는데.. 추측해보면 첨에 화면 이동하면 getAllGroupList를 불러준다 근데 못불러오면 errMsg얘가 변경되도록 했음

그래서 걔가 바뀌고 화면이 갱신되고 또 errMsg가 또 바뀌고.. 무한반복인듯

(그리고 또 고민인거는 이게 화면? 컴포넌트? 하나에 뷰모델을 여러개 둬도 되는걸까? 일단 GroupViewModel에 뭐 넣어야될게 많아서 MainViewModel이랑 분리해서 만들었는데 MainViewModel에 있는 값이 필요했단말임

근데 또 뷰모델을 하나로 한다? 그러면 그룹관련된거 많아질거고 그렇게 안할라면 메인쪽에 그룹 뷰모델을 가지고있게 하던가 그룹쪽에 메인 뷰모델 가지도록 하던가 해야했음 근데 걍 그룹에 메인 가지고있도록 했음)

errMsg바꿔주는 부분이 저 postValueEvent임

그래서 errMsg없으면 이게 무한반복이 안됨 왜냐면 네트워크 연결 실패면 어차피 groupList도 갱신이 안됨

암튼 이런 점을 조심해야될듯

다시 그리니깐 절대 state를 composeable함수 내에서 업데이트 하지말도록

엥 근데 궁금한게 있는데 그러면

왜 errMsg 바뀌는건 무한반복되는데 groupList바꾸는건 왜 무한반복안됨?

첨에 화면 부를때 groupList 요청하고 값 바뀌고 리스트가 있는 화면이 그려질건데

그러면 그때 또 groupList를 부름 그래서 로그에는 api요청 로그가 두번찍히지

근데 그러면 groupList를 불렀으니깐 또 그려져야되는거 아닌가? 왜 두번만 그려짐?

뭔가 내부적으로 값을 비교해서 값이 똑같으면 동일한 state인걸로 판단하는건가?

근데 그렇게 따지면 errMsg얘도 똑같은데

 

무튼 두번 불러도 어쨌든!! 그냥 컴포저블 함수 안에 아무 조치 없이 state를 변경시킬수있게 해서는 안된다

 

암튼 그래서 내가 생각해낸 .. 내맘대로 생각해낸거는 두개 방법

 

1. 클릭할때 viewmodel 에 데이터 업데이트

클릭할때 viewmodel에 값을 업데이트하면 클릭이 한번이므로 괜찮다

 

2. useEffect 사용

딱 한번만 실행되도록 만들 수 있으므로 반복해서 여러번 api호출을 하지 않는다

 

근데.. 생각해보니깐 컴포즈에서는 Event가 따로 필요없을것같다

왜냐면 LaunchedEffect에서 변경된경우에만 실행을 시킬수있기때문임

이렇게 해봤는데 잘 안됐다...

저렇게 했는데 토스트 메시지로 @1228~~~ 이런식으로 숫자가 나왔는데 아마 이 변수의 주소? 아닐가??

그리고 뷰모델의 라이브데이터의 값을 변경하지 않았는데도 계속 저 LaunchedEffect실행되었다

그리고 @ 뒤의 숫자가 변경되었다

아마 내 뇌피셜이지만 observeAsState라는 함수에서 라이브데이터를 state로 바꾸면서 livedata자체는 변경된것이 없지만

화면을 다시 그리면서 라이브데이터를 변형해주는 state는 매번 새로 만들어지기때문에 불리는듯/?

아 어렵다 모르겠다...