[코드 리팩토링] '미주정복' 6일차 - StockInputActivity

이윤진·2024년 1월 20일
0

코드 리팩토링

목록 보기
7/12

발생한 에러

Process: com.example.usdividend, PID: 32648 java.lang.NullPointerException at com.example.usdividend.view.setting.SettingViewKt.SettingTitle(SettingView.kt:62)

SettingView에서 다른 곳을 Navigate 할 때 발생하였다.
이게 LocalLifecycleOwner 때문에 발생하는 문제라고 생각해서 그냥
val nickname : String = settingViewModel.nickname.toString()
이렇게 코드를 변경해주었더니 위와 같은 에러는 발생하지 않게 되었다. 그러나 화면에 출력이 되지 않고

이런 식으로 출력되었다.

여러 방법으로 문제를 해결하려고 하였는데 해결되지 않았다. 이는 LocalLifecycleOwner의 문제가 아니었기 때문이다.

내가 초반에 name, email을

var name : String? = null
var email : String? = null

이런 식으로 초기화 시켰는데 이 null 값 때문에 화면을 navigate할 때 값에 null이 들어가서 발생한 에러였다.

var name = ""
var email = ""

이렇게 초기화를 하니 문제가 발생하지 않았다.

기존 StockInput 파트 구성

  1. StockInputActivity -> StockInputScreen 작동
  2. StockInputScreen -> compose 함수와 서버 연결 파트가 함께 있음

바뀐 StockInput 파트 구성

StockInputScreen의 파일 명과 함수 명을 StockInputView로 변경하였다.
StockInputViewModel을 만들어 데이터와 관련된 메서드를 개발하였다.

  1. StockInputActivity -> StockInputView에 StockInputViewModel 전달
  2. StockInputView -> compose 함수
  3. StockInputViewModel -> Database와 통신하는 메서드

StockInputViewModel

StockInputView에서 보유한 주식에 대한 정보를 얻어와 ViewModel에서 데이터베이스에 저장하는 기능을 가지고 있다.
View에서 데이터를 가져오기 위해 LiveData를 사용했다.
-StockInputViewModel-

val _stockName = MutableLiveData<String>()
val stockName: LiveData<String> get() = _stockName

-StockInputView-

viewModel._stockName.postValue(name)

이후에

fun updateHoldingdollar() {
  CoroutineScope(Dispatchers.IO).launch {
      if (stockPrice.toString().isNotEmpty()) {
          val newDollar = userDao.getHoldingdollar() + stockPrice.toString().toFloat()
          userDao.updateHoldingdollar(newDollar)
      } else {
          Toast.makeText(context, "주식 가격을 입력해 주세요", Toast.LENGTH_LONG).show()
      }
  }
}

이런 식으로 데이터베이스에 저장하였는데, 정상적인 string이 아닌 androidx.lifecycle...이런식으로 저장되었다.
이를 변환하려면 LiveData.switchMap을 사용하여야 하는 것 같다.

profile
Android/Flutter 개발

0개의 댓글