DividendDialog는 배당 리스트에서 회사명을 눌렀을 때 나타나는 Dialog이다.
![]() | ![]() |
---|
배당금 입금을 확인했다고 '네' 버튼을 누르면 배당 리스트에서 클릭된 회사명이 사라진다.
Dialog에서 어떤 것을 선택하였는지 알려주는 방법으로 SharedViewModel을 사용하였는데 이 ViewModel은 ViewModel의 개념을 모를 때 compose끼리 데이터를 전달하기 위해 작성한 것이기 때문에 이를 수정하여 주기로 하였다.
DividendDialog도 DividendViewModel을 사용하여, compose끼리 데이터를 전달하도록 만들었다.
아래는 Dialog에서 '네'를 클릭하였을 때 작동하는 메서드이다.
CoroutineScope(Dispatchers.IO).launch{
/*********회사 명과 Yes를 누른 데이터를 vm으로 보내기*******/
viewModel.company = company
viewModel.isYes = true
/********배당금 데이터베이스 삽입*******/
viewModel.insertDividend(company)
/*******보유 달러 업데이트*******/
viewModel.updateHoldingdollar(company)
}
기존의 SharedViewModel에서 하던 일을 viewModel이 하도록 변경하였다.
View에서는 위의 데이터를 받아 아래와 같이 작동한다.
/***********주식 이름 목록 삭제하기 *********/
if (viewModel.isYes){
stockNameList.remove(viewModel.company)
viewModel.isYes = false
}
그런데 viewModel에서 mutableStateOf로 설정하였는데 View에서 이를 인지하지 못하고 이름을 목록에서 삭제하지 않았다. viewModel.isYes가 true임에도 불구하고 작동하지 않는다는 것이다.
한 번 클릭한 주식 이름을 다시 클릭하였을 때,
A resource failed to call close.
경고가 뜨고, Dialog가 뜨지 않는 것으로 보아, 뭔가 전체적으로 문제가 있는 것 같다...
DividendActivity가 DividendScreen을 content로 보여주는 화면이다.
DividendScreen에는 compose 함수와 서버와 통신하는 메서드가 있었다.
서버와 통신하는 부분은 데이터베이스에 저장하는 것을 바꾸어 이 부분을 DividendHistoryViewModel로 분리하였다.
private val _dividendData = MutableLiveData<List<DividendData>>()
val dividendData : LiveData<List<DividendData>> get() = _dividendData
fun getDividendData() = CoroutineScope(Dispatchers.IO).launch {
_dividendData.postValue(dividendDao.getAllDividend())
}
그리고 엑셀을 만드는 부분도 ViewModel에서 메서드를 만들어주었다.
fun makeExcel(){
val dividendAll = dividendDao.getAllDividend()
val dividendList = ArrayList<DividendListData>()
for(dividend in dividendAll){
dividendList.add(
DividendListData(
dividend.stockName,
dividend.stockDividend.toFloat(),
dividend.month.toInt()
)
)
}
excel(context, dividendList)
}