Skip to content

✏️ String Resource ViewModel 에서 시원하게 써보자

K004_김명석 edited this page Dec 2, 2022 · 5 revisions

🧰 String Resource ViewModel 에서 시원하게 써보자

val registeredSizeText = gifticonList.map { list ->
    if (list.isNotEmpty()) {
        "${list.size}개 등록됨"
    } else {
        ""
    }
}.stateIn(viewModelScope, SharingStarted.Eagerly, UIText.Empty)
  • 하드 코딩된 텍스트를 사용하면 안된다
  • xml/string.xml 을 사용하기에는 Context 를 사용하면 안된다

위의 조건이 우리를 힘들게 만들고 있다
기존에는 이러한 상황을 해결 하기 위해 TextView를 2개를 사용하고 list.size 만 넘기는 방법을 선택하거나
Activity 에서 collect 하여 getString을 이용하여 Format 된 String 을 표현하였다

이러한 상황을 해결하고자 UIText 객체와 DataBinding을 이용 해보기로 하였다.

sealed class UIText {

    object Empty : UIText()

    data class DynamicString(val string: String) : UIText()

    class StringResource(
        @StringRes val resId: Int,
        vararg val args: Any
    ) : UIText()

    fun asString(context: Context): String {
        return when (this) {
            is DynamicString -> string
            is StringResource -> context.getString(resId, *args)
            is Empty -> ""
        }
    }
}

UIText 는 아래의 3가지 클래스로 구성된다.

  • StateFlow 등의 초기상태나 비어있는 값을 위한 Empty
  • Runtime에 너무 다양하게 바뀌는 값을 위한 DynamicString
  • 여러개의 Formatted String 도 적용할 수 있는 StringResource
@BindingAdapter("setUIText")
fun setUIText(view: TextView, uiText: UIText?) {
    view.text = uiText?.asString(view.context) ?: ""
}

binding 초기화시 값이 null 이 들어오는 것을 대응을 해준다.

<TextView
    android:id="@+id/tv_registered"
    ...
    app:setUIText="@{vm.registeredSizeText}" />

xml 에서는 위와 같이 사용을 한다

<string name="add_gifticon_registered">%d개 등록됨</string>

string.xml 에 저장되어 있는 Resource

val registeredSizeText = gifticonList.map { list ->
    if (list.isNotEmpty()) {
        UIText.StringResource(R.string.add_gifticon_registered, list.size)
    } else {
        UIText.Empty
    }
}.stateIn(viewModelScope, SharingStarted.Eagerly, UIText.Empty)

이제 위와 같이 리펙토링을 통해 ViewModel 에서도 원하는 Text를 표현할 수 있게되었다!

✍️ BEEP Tech Blog

박명범

양수진

김명석

이지훈

👾 BEEP

🗣 Ground Rule

✏️ Conventions

⚙️ Setting

🌱 Daily Scrum

week 1
week 2
week 3
week 4
week 5
week 6
Clone this wiki locally