본문 바로가기
개발

[Jetpack Compose] State와 DataStore 연결하기

by jonghoonpark 2023. 6. 3.

https://developer.android.com/topic/libraries/architecture/datastore

 

앱 아키텍처: 데이터 영역 - Datastore - Android 개발자  |  Android Developers

데이터 영역 라이브러리에 관한 이 앱 아키텍처 가이드를 통해 Preferences DataStore 및 Proto DataStore, 설정 등을 알아보세요.

developer.android.com

DataStore 라는것이 생겼다.

 

옛날에는 SharedPreference 라는 것을 썼었는데 더 모던해진 애로 이해하면 될 것 같다.
정확한 설명은 다음과 같다.

Jetpack DataStore is a data storage solution that allows you to store key-value pairs or typed objects with protocol buffers. DataStore uses Kotlin coroutines and Flow to store data asynchronously, consistently, and transactionally.

 

아무튼 이 애를 Compose 환경에서 쓸 수 있도록 연결한 과정에 대해서 설명한다.


설정 페이지를 만들기 위해서 아래와 같은 작업을 진행했으며
1차적인 목표는 checkbox를 선택했을 때 해당 선택 정보가 로컬 기기에 저장되기를 바랬다.

그리고 이를 위해서 Compose 와 DataStore 를 연결해야 했다.

 

일단은 DataStore를 만드는 부분이다.

 

SettingDataStore.kt

class SettingDataStore {
    companion object {
        val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
        val ignore_no_content_key = booleanPreferencesKey("ignore_no_content")
        val ignore_duplicated_key = booleanPreferencesKey("ignore_duplicated")
    }
}

 

DataStore의 이름을 정해주고 필요한 key들을 생성해둔다.

 

 

SettingActivity.kt

@Composable
fun SettingPage() {
    val dataStore = (LocalContext.current).dataStore

    val ignoreNoContentState = remember { mutableStateOf(false) }
    val ignoreNoDuplicatedState = remember { mutableStateOf(false) }

    LaunchedEffect(Unit) {
        dataStore.data.collect { preferences ->
            ignoreNoContentState.value = preferences[ignore_no_content_key] ?: false
            ignoreNoDuplicatedState.value = preferences[ignore_duplicated_key] ?: false
        }
    }

    LaunchedEffect(ignoreNoContentState.value) {
        dataStore.edit { preferences ->
            preferences[ignore_no_content_key] = ignoreNoContentState.value
        }
    }

    LaunchedEffect(ignoreNoDuplicatedState.value) {
        dataStore.edit { preferences ->
            preferences[ignore_duplicated_key] = ignoreNoDuplicatedState.value
        }
    }
    
    ... 중략 ...
}
Checkbox(
    checked = ignoreNoContentState.value,
    onCheckedChange = { checked ->
        run {
            ignoreNoContentState.value = checked
        }
    }
)

이렇게 만들어주면 CheckBox에서 값이 변경되었을 때 DataStore에도 반영이 되게 된다.

댓글