package Ġcom . example . framework Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . create ViewModel Lazy Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . example . framework . databinding . Fragment Io Binding Ċ import Ġkotlin . reflect . K Class Ċ Ċ open Ġclass ĠBase Fragment Ġ: ĠFragment () Ċ Ċ abstract Ġclass ĠIo Fragment < Request , ĠResponse >( viewModel Factory : ĠViewModel Provider . Factory ) Ġ: ĊĠĠĠ ĠBase Fragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġio ViewModel : ĠIO ViewModel < Request , ĠResponse > Ġby Ġcreate ViewModel Lazy ( ĊĠĠĠĠĠĠĠ ĠviewModel Class , ĊĠĠĠĠĠĠĠ Ġ{ ĠviewModel Store Ġ}, ĊĠĠĠĠĠĠĠ Ġ{ ĠviewModel Factory Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġabstract Ġval ĠviewModel Class : ĠK Class < out ĠIO ViewModel < Request , ĠResponse >> ĊĊĠĠĠ Ġabstract Ġval Ġrequest : ĠRequest ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Io Binding ĊĊĠĠĠ Ġfinal Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Io Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġbinding . content . addView ( onCreate ContentView ( in flater , Ġcontainer , ĠsavedInstanceState )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun ĠonCreate ContentView ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġio ViewModel . operate ( request ). observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUI State . Loading Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . isLoading Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Loading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUI State . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . isLoading Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonError ( it . ex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUI State . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . isLoading Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ( it . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġon Loading () Ġ{} ĊĊĠĠĠ Ġabstract Ġfun ĠonError ( throwable : ĠThrowable ) ĊĊĠĠĠ Ġabstract Ġfun ĠonSuccess ( data : ĠResponse ) Ċ } Ċ Ċ abstract Ġclass ĠResponse Io Fragment < Response >( viewModel Factory : ĠViewModel Provider . Factory ) Ġ: ĊĠĠĠ ĠIo Fragment < Unit , ĠResponse >( viewModel Factory ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġrequest : ĠUnit ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠUnit Ċ Ċ }