package Ġcom . programming hero . mv vm _ boilerplate . ui . base Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . view binding . View Binding Ċ import Ġcom . programming hero . mv vm _ boilerplate . data . User Preferences Ċ import Ġcom . programming hero . mv vm _ boilerplate . data . network . Remote DataSource Ċ import Ġcom . programming hero . mv vm _ boilerplate . data . repository . Base Repository Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . launch Ċ Ċ abstract Ġclass ĠBase Fragment < VM Ġ: ĠViewModel , ĠB Ġ: ĠView Binding , ĠR Ġ: ĠBase Repository > Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġuser Preferences : ĠUser Preferences ĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġbinding : ĠB ĊĠĠĠ Ġprotected Ġlateinit Ġvar ĠviewModel : ĠVM ĊĠĠĠ Ġprotected Ġval Ġremote DataSource Ġ= ĠRemote DataSource () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġuser Preferences Ġ= ĠUser Preferences ( require Context ()) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= Ġget Fragment Binding ( in flater , Ġcontainer ) ĊĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠViewModel Factory ( get Fragment Repository ()) ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Provider ( this , Ġfactory ). get ( get ViewModel ()) ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ Ġuser Preferences . auth Token . first () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġget ViewModel (): ĠClass < VM > ĊĠĠĠ Ġabstract Ġfun Ġget Fragment Binding ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?): ĠB ĊĠĠĠ Ġabstract Ġfun Ġget Fragment Repository (): ĠR Ċ }