@ file : Suppress (" Remove Explicit Type Arguments ") Ċ Ċ package Ġcom . extensions . lifecycle . functions Ċ Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . extensions . lifecycle . components . Type Safe ViewModel Factory Ċ Ċ // region ĠFragment Activity Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠViewModel > ĠFragment Activity . viewModel ( key : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory : ĠViewModel Provider . Factory ): ĠT Ġ{ ĊĠĠĠ Ġreturn ĠViewModel Provider ( this , Ġfactory ). let Ġ{ Ġprovider Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . get ( key , ĠT :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . get ( T :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠViewModel > ĠFragment Activity . viewModel Lazy ( key : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory : ĠViewModel Provider . Factory ): ĠLazy < T > Ġ{ ĊĠĠĠ Ġreturn Ġlazy Ġ{ ĠviewModel < T >( key , Ġfactory ) Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠViewModel > ĠFragment Activity . viewModel Lazy ( key : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory : ĠType Safe ViewModel Factory < T >): ĠLazy < T > Ġ{ ĊĠĠĠ Ġreturn Ġlazy Ġ{ ĠviewModel < T >( key , Ġfactory ) Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠViewModel > ĠFragment Activity . viewModel Lazy ( key : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross inline Ġprovide Factory : Ġ() Ġ-> ĠType Safe ViewModel Factory < T >): ĠLazy < T > Ġ{ ĊĠĠĠ Ġreturn Ġlazy Ġ{ ĠviewModel < T >( key , Ġprovide Factory ()) Ġ} Ċ } Ċ Ċ // endregion Ċ Ċ // region ĠFragment Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠViewModel > ĠFragment . viewModel ( key : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory : ĠViewModel Provider . Factory ): ĠT Ġ{ ĊĠĠĠ Ġreturn ĠViewModel Provider ( this , Ġfactory ). let Ġ{ Ġprovider Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . get ( key , ĠT :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . get ( T :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠViewModel > ĠFragment . viewModel Lazy ( key : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory : ĠViewModel Provider . Factory ): ĠLazy < T > Ġ{ ĊĠĠĠ Ġreturn Ġlazy Ġ{ ĠviewModel < T >( key , Ġfactory ) Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠViewModel > ĠFragment . viewModel Lazy ( key : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory : ĠType Safe ViewModel Factory < T >): ĠLazy < T > Ġ{ ĊĠĠĠ Ġreturn Ġlazy Ġ{ ĠviewModel < T >( key , Ġfactory ) Ġ} Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠViewModel > ĠFragment . viewModel Lazy ( key : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcross inline Ġprovide Factory : Ġ() Ġ-> ĠType Safe ViewModel Factory < out ĠT >): ĠLazy < T > Ġ{ ĊĠĠĠ Ġreturn Ġlazy Ġ{ ĠviewModel < T >( key , Ġprovide Factory ()) Ġ} Ċ } Ċ Ċ // endregion Ċ Ċ fun Ġ< T Ġ: ĠViewModel > Ġtype Safe ViewModel Factory ( create : Ġ() Ġ-> ĠT ): ĠType Safe ViewModel Factory < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠType Safe ViewModel Factory < T >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate (): ĠT Ġ= Ġcreate () ĊĠĠĠ Ġ} Ċ }