[ViewModel] 4. ViewModel을 이용한 Fragment간 데이터 공유

2021. 5. 4. 20:27· Android Jetpack/ViewModel
목차
  1. 목표
  2. ViewModel의 생성 방식
  3. by activityViewModels를 활용한 Fragment간 데이터 공유 
  4. 정리
반응형

목표

  • ViewModel을 이용하여 Fragment간에 데이터를 공유하는 방법을 안다.

ViewModel의 생성 방식

ViewModel은 View(Activity 혹은 Fragment)의 Lifecycle에 Dependent한 Lifecycle을 갖는다. ViewModel 속 데이터가 살아있는 기간이 View가 살아있는 기간보다 길기 때문에 View가 살아 있는 동안은 ViewModel 속 데이터는 유지된다. 그런데 Fragment에는 조금 특이한 성질이 있다. 바로 Fragment의 생명주기는 Fragment가 붙어 있는 Activity에 Dependent한 성질이다. 

그림1. Activity와 Fragment의 ViewModel

이러한 성질로 인해 <그림1>과 같이 하나의 Activity에는 여러 개의 Fragment가 존재할 수 있으며, 각 Fragment는 각자의 생명주기에 맞는 ViewModel을 가질 수 있다. 

그림2. Fragment2에서 Fragment1ViewModel 초기화

하지만 <그림2>와 같이 Fragment1ViewModel을 Fragment2의 Lifecycle에 Dependent하게 초기화할 경우, ViewModel은 View의 ViewModelStore에 만들어지므로 Fragment1ViewModel 인스턴스가 Fragment2(ViewModel Store)에 새로 생성된다. 이로 인해 Fragment1ViewModel 인스턴스 2개는 서로 간에 데이터를 공유할 수가 없게 된다.

 

*ViewModelStore의 설명은 아래 글을 참조하자

 

[ViewModel] 2. ViewModel은 어떻게 저장되는가?

목표 ViewModel이 저장 및 호출되는 방법에 대해 간략하게 이해한다. 이 글은 자바 및 안드로이드에 대한 많은 이해가 필요하므로, 이해가 안가면 3번 글로 넘어가도 무방하다. ViewModelProvider을 이용

kotlinworld.com

 

by activityViewModels를 활용한 Fragment간 데이터 공유 

그렇다면 Fragment가 Dependent한 Activity의 ViewModel을 만드는 것은 어떨까? 앞서 3번 글에서 by activityViewModels()는 Fragment에서만 호출하며, Fragment가 붙은 Activity에 종속된다고 하였다.

inline fun <reified VM : ViewModel> Fragment.activityViewModels

 우리는 이를 응용하여 다음과 같이 Fragment간에 데이터를 공유하는 ShareViewModel을 만들 수 있다.

private val viewModel: ShareViewModel by activityViewModels()

그림3. Fragment간 데이터를 공유하는 ViewModel

이 ShareViewModel은 MainActivity 상에서는 by viewmodels()를 활용하여 초기화가 가능하며, Fragment속에서는 by activityViewModels()를 이용하여 초기화가 가능하다. 이 두 방식으로 생성되는 ShareViewModel은 같은 인스턴스를 가리킨다. 즉, 공유된다.

 

 이렇게 할 경우 MainActivity의 ViewModelStore에서 이 ShareViewModel을 하나만 생성하여 서로간에 공유하도록 만든다. 즉 by activityViewModels()가 MainActivity 속 여러 Fragment에서 호출되더라도 하나의 ShareViewModel만 만들어진다. 이를 통해 Fragment 간에 데이터 전달이 가능해진다.

 

하나의 Activty에 attach된 여러 Fragment들은 Activitiy에 종속되는 ViewModel을 생성함으로써 데이터를 공유 및 전달 할 수 있다.

 

정리

ViewModel에서 데이터가 유지되는 특징을 이용해 Fragment간 데이터 전달 및 Activity-Fragment 간 데이터 전달이 가능하다는 것을 이해하자.

반응형
  1. 목표
  2. ViewModel의 생성 방식
  3. by activityViewModels를 활용한 Fragment간 데이터 공유 
  4. 정리


 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com

'Android Jetpack/ViewModel' 카테고리의 다른 글
  • [ViewModel] 3. ViewModel의 다양한 초기화 방법
  • [ViewModel] 2. ViewModel은 어떻게 저장되는가?
  • [ViewModel] 1. View의 Lifecycle 동안 데이터를 유지시켜 주는 클래스
Dev.Cho
Dev.Cho
'조세영의 Kotlin World'는 Kotlin를 전문적으로 다루는 개인 기술 블로그입니다. Kotlin 세계에 대한 양질의 자료를 제공하며 Kotlin, Android, Spring, CI, CD 분야에 대해 다룹니다.
Dev.Cho
조세영의 Kotlin World
Dev.Cho
전체
오늘
어제

블로그 메뉴

  • LinkedIn
  • GitHub
  • 분류 전체보기 (491)
    • Kotlin (104)
      • Class and Interface (19)
      • Variable and Function (8)
      • Modifier (5)
      • Collection (14)
      • Time (8)
      • 동시성 제어 (7)
      • Reactive Programming (2)
      • Paradigm (2)
      • Kotlin 자료구조 (15)
      • Design Patterns (11)
      • Algorithm (3)
      • Exception (1)
      • 기타 (9)
      • Update History (0)
    • Coroutines (32)
      • Coroutine Basics (18)
      • Flow (9)
      • CoroutineScope (3)
      • Debugging (2)
    • Testing Codes (28)
      • Test 기본 (3)
      • JUnit5 (9)
      • MockK (6)
      • Testing Coroutines (1)
      • Testing Android (8)
      • Test 기타 (1)
    • Spring (50)
      • Dependency Injection (18)
      • Settings (5)
      • REST API (0)
      • DevTools (1)
      • MVC (18)
      • Error (2)
      • MongoDB (2)
      • Database (4)
    • Android (39)
      • Architecture (2)
      • Component (5)
      • Manifest (1)
      • Lifecycle (2)
      • Dependency Injection (17)
      • Resource (1)
      • Storage (1)
      • Security and Optimization (1)
      • WebView (2)
      • Error (6)
    • Android Jetpack Compose (33)
      • Compose (6)
      • Compose Modifier (13)
      • Compose Resource (4)
      • Compose State (4)
      • Compose Side Effect (6)
    • Android Jetpack Compose UI (48)
      • Compose Layout (14)
      • Compose Text (10)
      • Compose Button (5)
      • Compose Dialog (2)
      • Compose TextField (0)
      • Compose UIs (4)
      • Compose Animation (1)
      • Compose Canvas (12)
    • Android Jetpack (10)
      • Datastore (5)
      • ViewModel (4)
      • LiveData (1)
      • Paging (0)
    • KMP (5)
    • Programming (4)
    • Machine (9)
      • JVM (7)
      • Linux (2)
    • CI, CD (74)
      • Gradle (12)
      • Groovy Gradle (5)
      • Git (25)
      • Git Remote (5)
      • GitHub (5)
      • GitHub Actions (21)
    • Network (33)
      • GraphQL (12)
      • HTTP (11)
      • Basic (9)
    • 오픈소스 (3)
    • Database (3)
      • MongoDB (3)
    • IDE (6)
      • Android Studio (2)
      • Intellij (4)
    • Firebase (1)
    • Javascript (9)

공지사항

  • 코틀린 코루틴 완전 정복 강의 in 인프런 오픈
  • 코틀린 코루틴의 정석 책 출간
  • Kotlin Coroutines 공식 기술 문서 한국어 번⋯
  • GitHub에서 조세영의 Kotlin World를 Foll⋯
  • 문의&제안

인기 글

태그

  • 유닛 테스팅
  • github
  • Android Compose
  • junit
  • 스프링
  • Unit Testing
  • GIT
  • kotlin spring
  • java
  • Android
  • Coroutine
  • github actions
  • Jetpack Compose
  • 의존성 주입
  • GraphQL
  • 코루틴
  • gradle
  • flow
  • junit4
  • dagger2
  • junit5
  • Class
  • Dependency Injection
  • 안드로이드
  • 코틀린
  • Kotlin
  • Spring
  • Spring boot
  • HTTP
  • compose

최근 글

반응형
hELLO · Designed By 정상우.v4.3.0
Dev.Cho
[ViewModel] 4. ViewModel을 이용한 Fragment간 데이터 공유
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.