
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдЗрди рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рди рдХрд░реЗрдВред
1. рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ LiveData рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреА рдХрдореА
рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдПрдХ рдЬрдЯрд┐рд▓ рдЬреАрд╡рди рдЪрдХреНрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╣рдореЗрд╢рд╛ рдирд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╣реЗрдЬреЗ рдЧрдП рдЯреБрдХрдбрд╝реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рджреМрд░рд╛рди рдирд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЦрдВрдб рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рджреГрд╢реНрдп рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП onDestroy()
рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ DESTROYED рд╕реНрдерд┐рддрд┐ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо onDreateView onCreateView()
рдпрд╛ рдмрд╛рдж рдореЗрдВ (рдЖрдорддреМрд░ рдкрд░ onActivityCreated()
) рдореЗрдВ onActivityCreated()
рдЕрд╡рд▓реЛрдХрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдВрд╢ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
class BooksFragment: Fragment() { private lateinit var viewModel: BooksViewModel override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_books, container) } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) viewModel = ViewModelProviders.of(this).get(BooksViewModel::class.java) viewModel.liveData.observe(this, Observer { updateViews(it) })
рдлрд┐рд░ рд╣рдо рд╣рд░ рдмрд╛рд░ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдлрд┐рд░ рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдкрд░ рдСрдмреНрдЬрд░реНрд╡рд░ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдорд╛рди рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди LiveData рдкрд┐рдЫрд▓реЗ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ LifecycleOwner (рдЯреБрдХрдбрд╝рд╛) DESTROYED рд╕реНрдерд┐рддрд┐ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛ рд╣реИред рдпрд╣ рдЕрдВрддрддрдГ рд╕рдорд╛рди рдФрд░ рдПрдХ рд╕рд╛рде рд╕рдХреНрд░рд┐рдп рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреА рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╣реА рдХреЛрдб onChanged()
рд╕реЗ рдХрдИ рдмрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
рдЦрдВрдбрд┐рдд рдЬреАрд╡рди рдЪрдХреНрд░ рд╕реЗ getViewLifecycleOwner () рдпрд╛ getViewLifecycleOwnerLiveData () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬреЛ рд╕рдорд░реНрдерди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗ 28.0.0 рдФрд░ AndroidX 1.0.0, рдЗрд╕рд▓рд┐рдП LiveData рд╣рд░ рдмрд╛рд░ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХреЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛, рдЬрдм рджреГрд╢реНрдп рдЯреБрдХрдбрд╝рд╛ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:
class BooksFragment : Fragment() { ... override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) viewModel = ViewModelProviders.of(this).get(BooksViewModel::class.java) viewModel.liveData.observe(viewLifecycleOwner, Observer { updateViews(it) }) } ... }
2. рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░реАрди рд░реЛрдЯреЗрд╢рди рдХреЗ рдмрд╛рдж рд░рд┐рдмреВрдЯ рдбреЗрдЯрд╛
рд╣рдо рдПрдВрдХреНрд░реАрдХрд░рдг рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХреЛ onCreate()
рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдореЗрдВ (рдФрд░ onCreateView()
рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡реНрдпреВрдореЙрдбрд▓ рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдкрд╣рд▓ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЗ рддрд░реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рд╕реНрдХреНрд░реАрди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдШреБрдорд╛рд╡ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рдкреБрдирдГ рд▓реЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рднрд▓реЗ рд╣реА ViewModel рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛), рдЬреЛ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрд╕ рдмреЗрдХрд╛рд░ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
class ProductViewModel( private val repository: ProductRepository ) : ViewModel() { private val productDetails = MutableLiveData<Resource<ProductDetails>>() private val specialOffers = MutableLiveData<Resource<SpecialOffers>>() fun getProductsDetails(): LiveData<Resource<ProductDetails>> { repository.getProductDetails()
рдирд┐рд░реНрдгрдп рдЖрдкрдХреЗ рддрд░реНрдХ рдкрд░ рднреА рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢ рдХрд░реЗрдЧрд╛, рддреЛ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕рдВрднрд╡рддрдГ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╕рд╛рде рд╣реА, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- AbsentLiveData рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рд╣реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ;
- рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рддрдм рд╢реБрд░реВ рдХрд░реЗрдВ рдЬрдм рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, OnClickListener рдореЗрдВ;
- рдФрд░ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╕рд░рд▓: ViewModel рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХреЙрд▓ рдбрд╛рд▓реЗрдВ рдФрд░ рд╕рд░рд▓ рдЧреЗрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
class ProductViewModel( private val repository: ProductRepository ) : ViewModel() { private val productDetails = MutableLiveData<Resource<ProductDetails>>() private val specialOffers = MutableLiveData<Resource<SpecialOffers>>() init { loadProductsDetails()
3. рд▓реАрдХ ViewModels
рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдХрд┐ рд╣рдореЗрдВ ViewModel рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдиреНрдп рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП ViewModels рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЧреБрдЬрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рднреА рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЧрддрд┐рд╡рд┐рдзрд┐ (рдпрд╛ рдЯреБрдХрдбрд╝рд╛) рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, ViewModel рдХреЛ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЧрддрд┐рд╡рд┐рдзрд┐ рдЬреАрд╡рд┐рдд рд░рд╣ рд╕рдХрддреА рд╣реИ, рддрд╛рдХрд┐ ViewModel рдХреЛ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдЗрд╕ рд▓реАрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рд┐рдВрдЧрд▓рдЯрди рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╢реНрд░реЛрддрд╛, рд╡реНрдпреВрдореЙрдбрд▓ рдХреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╢реНрд░реЛрддрд╛ рдирд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ:
@Singleton class LocationRepository() { private var listener: ((Location) -> Unit)? = null fun setOnLocationChangedListener(listener: (Location) -> Unit) { this.listener = listener } private fun onLocationUpdated(location: Location) { listener?.invoke(location) } } class MapViewModel: AutoClearViewModel() { private val liveData = MutableLiveData<LocationRepository.Location>() private val repository = LocationRepository() init { repository.setOnLocationChangedListener { liveData.value = it } } }
рдпрд╣рд╛рдВ рд╕рдорд╛рдзрд╛рди рд╢реНрд░реЛрддрд╛ рдХреЛ onCleared()
рд╡рд┐рдзрд┐ рдореЗрдВ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ WeakReference
рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ, рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдФрд░ ViewModel рдХреЗ рдмреАрдЪ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП LiveData рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
@Singleton class LocationRepository() { private var listener: ((Location) -> Unit)? = null fun setOnLocationChangedListener(listener: (Location) -> Unit) { this.listener = listener } fun removeOnLocationChangedListener() { this.listener = null } private fun onLocationUpdated(location: Location) { listener?.invoke(location) } } class MapViewModel: AutoClearViewModel() { private val liveData = MutableLiveData<LocationRepository.Location>() private val repository = LocationRepository() init { repository.setOnLocationChangedListener { liveData.value = it } } override onCleared() { repository.removeOnLocationChangedListener() } }
4. ViewData рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ
рдпрд╣ рдПрдХ рдмрдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рд┐рддреЛрдВ рдХреЗ рдЕрд▓рдЧрд╛рд╡ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реИред рджреГрд╢реНрдп - рдЯреБрдХрдбрд╝реЗ рдФрд░ рдЧрддрд┐рд╡рд┐рдзрд┐ - LiveData рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреА рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ ViewModels рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИред рджреГрд╢реНрдп рдХреЗрд╡рд▓ LiveData рджреЗрдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ MutableLiveData рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
class CatalogueViewModel : ViewModel() {
5. рдкреНрд░рддреНрдпреЗрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж ViewModel рдирд┐рд░реНрднрд░рддрд╛ рдмрдирд╛рдирд╛
ViewModels рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдХреНрд░реАрди рд░реЛрдЯреЗрд╢рди, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╣рд░ рдмрд╛рд░ рдмрджрд▓рд╛рд╡ рд╣реЛрдиреЗ рдкрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрднреА-рдХрднреА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдХреБрдЫ рддрд░реНрдХ рдбрд┐рдЬрд╛рдЗрдирд░ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ ViewModelFactory рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдирджреЗрдЦреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ ViewModel рдХреЗ рд╕рдорд╛рди рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред
ViewModelProvider ViewModel рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдЪрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ViewModelFactory рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдХреЛрдб рд╣реИ:
class MoviesViewModel( private val repository: MoviesRepository, private val stringProvider: StringProvider, private val authorisationService: AuthorisationService ) : ViewModel() { ... } class MoviesViewModelFactory( private val repository: MoviesRepository, private val stringProvider: StringProvider, private val authorisationService: AuthorisationService ) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { return MoviesViewModel(repository, stringProvider, authorisationService) as T } } class MoviesActivity : AppCompatActivity() { @Inject lateinit var viewModelFactory: MoviesViewModelFactory private lateinit var viewModel: MoviesViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_movies) injectDependencies() viewModel = ViewModelProviders.of(this, viewModelFactory).get(MoviesViewModel::class.java) } ... }
рддрдм рд╣рд░ рдмрд╛рд░ рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ, рд╣рдо ViewModelFactory рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреА рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдирдП рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ (рдмрд╢рд░реНрддреЗ рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реАрдорд┐рдд рди рд╣реЛрдВ)ред
class MoviesViewModel( private val repository: MoviesRepository, private val stringProvider: StringProvider, private val authorisationService: AuthorisationService ) : ViewModel() { ... } class MoviesViewModelFactory( private val repository: Provider<MoviesRepository>, private val stringProvider: Provider<StringProvider>, private val authorisationService: Provider<AuthorisationService> ) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { return MoviesViewModel(repository.get(), stringProvider.get(), authorisationService.get() ) as T } } class MoviesActivity : AppCompatActivity() { @Inject lateinit var viewModelFactory: MoviesViewModelFactory private lateinit var viewModel: MoviesViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_movies) injectDependencies() viewModel = ViewModelProviders.of(this, viewModelFactory).get(MoviesViewModel::class.java) } ... }