/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠByte D ance ĠInc Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . by ted ance . scene . k tx Ċ Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . ViewModel Store Ċ import Ġandroidx . lifecycle . ViewModel Store Owner Ċ import Ġcom . by ted ance . scene . Scene Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġ[ Lazy ] Ġdelegate Ġto Ġaccess Ġthe ĠScene 's ĠViewModel , Ġif Ġ[ factory Producer ] Ċ Ġ* Ġis Ġspecified Ġthen Ġ[ ViewModel Provider . Factory ] Ġreturned Ġby Ġit Ġwill Ġbe Ġused Ċ Ġ* Ġto Ġcreate Ġ[ ViewModel ] Ġfirst Ġtime . Ċ Ġ* Ċ Ġ* Ġscoped Ġto Ġthis ĠScene Ċ Ġ* Ġ``` Ċ Ġ* Ġclass ĠTest Scene Ġ: ĠScene () Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġview model : ĠTest ViewModel Ġby Ġview Models () Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġscoped Ġto Ġparent ĠScene Ċ Ġ* Ġ``` Ċ Ġ* Ġclass ĠTest Scene Ġ: ĠScene () Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġview model : ĠTest ViewModel Ġby Ġview Models Ġ({ require Parent Scene () }) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġscoped Ġto Ġroot ĠNavigation Scene Ċ Ġ* Ġ``` Ċ Ġ* Ġclass ĠTest Scene Ġ: ĠScene () Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġview model : ĠTest ViewModel Ġby Ġview Models Ġ({ require Navigation Scene () }) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġscoped Ġto ĠActivity Ċ Ġ* Ġ``` Ċ Ġ* Ġclass ĠTest Scene Ġ: ĠScene () Ġ{ Ċ Ġ* ĠĠĠĠ Ġval Ġview model : ĠTest ViewModel Ġby Ġactivity ViewModels () Ċ Ġ* Ġ} Ċ Ġ* Ġ`` Ċ Ġ* Ċ Ġ* ĠThis Ġproperty Ġcan Ġbe Ġaccessed Ġonly Ġafter Ġthe ĠScene Ġis Ġattached , Ċ Ġ* Ġand Ġaccess Ġprior Ġto Ġthat Ġwill Ġresult Ġin ĠIllegalArgumentException . Ċ Ġ*/ Ċ @ MainThread Ċ public Ġinline Ġfun Ġ< re ified ĠVM Ġ: ĠViewModel > ĠScene . activity ViewModels ( ĊĠĠĠĠĠĠĠ Ġno inline Ġfactory Producer : Ġ(() Ġ-> ĠViewModel Provider . Factory )? Ġ= Ġnull ): Ġkotlin . Lazy < VM > Ġ{ ĊĠĠĠ Ġreturn Ġcreate ViewModel Lazy ( VM :: class , Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġactivity Ġ?: Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ViewModel Ġcan Ġbe Ġaccessed Ġonly Ġwhen ĠScene Ġis Ġattached " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfragment Activity : ĠFragment Activity Ġ= Ġactivity Ġas ? ĠFragment Activity Ġ?: Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Activity Ġshould Ġbe ĠFragment Activity Ġsubclass " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfragment Activity . viewModel Store ĊĠĠĠ Ġ}, Ġfactory Producer ) Ċ } Ċ Ċ @ MainThread Ċ public Ġinline Ġfun Ġ< re ified ĠVM Ġ: ĠViewModel > ĠScene . view Models ( ĊĠĠĠĠĠĠĠ Ġno inline Ġowner Producer : Ġ() Ġ-> ĠViewModel Store Owner Ġ= Ġ{ Ġthis Ġ}, ĊĠĠĠĠĠĠĠ Ġno inline Ġfactory Producer : Ġ(() Ġ-> ĠViewModel Provider . Factory )? Ġ= Ġnull ): Ġkotlin . Lazy < VM > Ġ{ ĊĠĠĠ Ġreturn Ġcreate ViewModel Lazy ( VM :: class , Ġ{ Ġowner Producer (). viewModel Store Ġ}, Ġfactory Producer ) Ċ } Ċ Ċ @ MainThread Ċ fun Ġ< VM Ġ: ĠViewModel > ĠScene . create ViewModel Lazy ( ĊĠĠĠĠĠĠĠ ĠviewModel Class : ĠK Class < VM >, ĊĠĠĠĠĠĠĠ Ġstore Producer : Ġ() Ġ-> ĠViewModel Store , ĊĠĠĠĠĠĠĠ Ġfactory Producer : Ġ(() Ġ-> ĠViewModel Provider . Factory )? Ġ= Ġnull Ċ ): ĠLazy < VM > Ġ{ ĊĠĠĠ Ġval Ġfactory Promise Ġ= Ġfactory Producer Ġ?: Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapplication Ġ= Ġactivity ?. application Ġ?: Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ViewModel Ġcan Ġbe Ġaccessed Ġonly Ġwhen ĠScene Ġis Ġattached " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠViewModel Provider . Android ViewModel Factory . getInstance ( application ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠViewModel Lazy ( viewModel Class , Ġstore Producer , Ġfactory Promise ) Ċ } Ċ Ċ @ MainThread Ċ private Ġinline Ġfun Ġ< re ified ĠVM Ġ: ĠViewModel > ĠViewModel Provider . get () Ġ= Ġget ( VM :: class . java ) Ċ Ċ class ĠViewModel Lazy < VM Ġ: ĠViewModel >( ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠviewModel Class : ĠK Class < VM >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstore Producer : Ġ() Ġ-> ĠViewModel Store , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfactory Producer : Ġ() Ġ-> ĠViewModel Provider . Factory Ċ ) Ġ: ĠLazy < VM > Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcached : ĠVM ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġval Ġvalue : ĠVM ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġcached ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( viewModel Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= Ġfactory Producer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstore Ġ= Ġstore Producer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewModel Provider ( store , Ġfactory ). get ( viewModel Class . java ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Initialized () Ġ= Ġcached Ġ!= Ġnull Ċ }