package Ġemail . example . pr atic al test . view _ model Ċ Ċ import Ġandroidx . compose . runtime . Mutable State Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġemail . example . pr atic al test . repository . UserRepository Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjavax . inject . Inject Ċ Ċ @ H ilt ViewModel Ċ class ĠMain ViewModel Ġ@ Inject Ġconstructor ( private Ġval Ġuser Repository : ĠUser Repository ): ĠViewModel () Ġ{ ĊĠĠĠ Ġsealed Ġclass ĠUi State Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠInitial : ĠUi State () ĊĊĠĠĠĠĠĠĠ Ġobject ĠLoading : ĠUi State () ĊĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠSuccess ( val Ġconc ated Str : ĠString ): ĠUi State () ĊĊĠĠĠĠĠĠĠ Ġobject ĠError : ĠUi State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġui State : ĠMutable State < Ui State > Ġ= Ġmutable State Of ( Ui State . Initial ) ĊĊĠĠĠ Ġfun Ġconcat Str Load ( str 1 : ĠString , Ġstr 2 : ĠString ){ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui State . value Ġ= ĠUi State . Loading ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . concat Str ( str 1 Ġ= Ġstr 1 , Ġstr 2 Ġ= Ġstr 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State . value Ġ= ĠUi State . Success ( conc ated Str Ġ= Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui State . value Ġ= ĠUi State . Error ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }