SharedPreferences vs DataStore
처음에는 SharedPreferences 를 사용해서 데이터를 저장하려고 했는데, 공식문서에서 SharedPreferences 를 사용하는 것 보다는 DataStore 를 사용하는 것을 추천한다고 해서 SharedPreferences 대신 DataStore 를 사용하였다.
가장 처음 한 일은 만들려는 기능(관련 알고리즘 보이기/숨기기)이 어느 부분에 영향을 주는지를 알아보았다.
1) 현재 프로젝트의 구조 그려보기
현재 랜덤리즘의 구조를 간단히 그려보았을 때, 위의 사진과 같았다.
여기서 SettingFragment 을 통해 변경된 값이 Problem/SettingFragment 의 화면에 보여야하므로, 2개의 화면이 변경된 값에 영향을 받는 다는 것을 알게되었다.
그렇다면 SettingFragment 와 ProblemFragment 사이에서 어떠한 데이터 흐름을 가지는지 생각해보았다.
2) 데이터흐름 살펴보기
위의 사진처럼 작성한 데이터 흐름대로 코드를 작성해주었고, 생각했던 대로 기능 구현은 완료되었다!
🤔 의문점1
공식문서를 보며 작성하긴 하였으나, UseCase 에 최상위 변수들을 가지고 있어도 되는건지는 아직 의문이다 ..
일단 나는 ChangeTagStateUseCase 에서 최상위 변수로 DataStore 를 위한 위임생성과 key 를 선언해주었다.
// ChangeTagStateUseCase.kt
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
val TAG_STATE_KEY = booleanPreferencesKey("tag_state")
다른 분들의 코드를 살펴보며 수정해봐야겠다...
🤔 의문점2
ProblemFragment(문제를 보여주는 화면) 가 SettingViewModel 을 가지고 있어도 되는가?
일단 변경된 값이 SettingFragment (설정화면) 에서도 유지됨을 사용자에게 보여주어야 하므로 SettingViewModel 에 DataStore 의 값을 읽어오는 Flow 를 작성해주었다.
// SettingViewModel.kt
class SettingViewModel @Inject constructor(
private val changeTagStateUseCase: ChangeTagStateUseCase,
private val getTagStateUseCase: GetTagStateUseCase
) : ViewModel() {
val tagState: Flow<Boolean> = getTagStateUseCase.invoke()
...
}
그런데 이 값을 ProblemFragment 에서도 사용해도 되는 것인가 ....!
그럼 ProblemViewModel 안에서 DataStore 에 접근하여 세팅값을 읽어와도 되는 것인가 ...? 그런데 DataStore 는 1개의 인스턴스를 생성하기때문에 ProblemViewModel 에서도 DataStore 에 접근하여 데이터를 가지고 와도 될 것 같기도하다!
일단 이 부분은 ViewModel 역할에 대한 개념이 부족하다고 판단되어서 ViewModel 을 조금 더 알아봐야겠다.
그리고 다른 사람들의 코드도 봐야겠다 ...
이 의문점에 대한 포스팅을 작성하였다!
아무튼 관련 알고리즘 보이기/숨기기 기능 구현 완료!
결과 화면
참고
'Android > 랜덤리즘' 카테고리의 다른 글
[랜덤리즘] 중복된 코드를 1개의 코드로 리팩토링하기 (0) | 2024.03.08 |
---|---|
[랜덤리즘] 설정화면에서 변경한 값을 다른 화면에서 사용해도 될까? (0) | 2024.02.28 |
[랜덤리즘] 관련 알고리즘 보이기/숨기기 기능 개발하기 -1 (0) | 2024.02.23 |
[랜덤리즘] 1차 배포하기 완료! (1) | 2024.02.21 |
개인정보처리방침 (0) | 2024.02.21 |