[코드 리팩토링] '미주정복' 8일차 - DividendDialog, DividendHistory

이윤진·2024년 1월 23일
0

코드 리팩토링

목록 보기
9/12

DividendDialog

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가 뜨지 않는 것으로 보아, 뭔가 전체적으로 문제가 있는 것 같다...

DividendHistory

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)
    }
profile
Android/Flutter 개발

0개의 댓글