Android. Программирование для профессионалов. 4-е издание



Download 21,53 Mb.
Pdf ko'rish
bet200/485
Sana13.07.2022
Hajmi21,53 Mb.
#787165
1   ...   196   197   198   199   200   201   202   203   ...   485
Bog'liq
Android Programmirovanie dlya professionalov 4-e izdanie 2020 Fillips Styuart Marsikano Gardner

val crimeId: UUID =
arguments?.getSerializable(ARG_CRIME_ID) 
as
UUID
Log.d(TAG, "args bundle crime ID:
$crimeId")
// Загрузка преступления из базы данных
}
...
}
Запустите приложение CriminalIntent. Оно будет работать
точно так же, но архитектура с независимостью
CrimeFragment
должна вызвать у вас приятные чувства.
Преобразования LiveData
Теперь, когда у 
CrimeFragment
есть идентификатор
преступления, ему нужно извлечь объект преступления из базы
данных, чтобы отобразить данные о преступ лении. Так как для
этого требуется поиск по базе данных, который вы не хотите
без необходимости повторять при повороте устройства,
добавьте 
CrimeDetail 
View 
Model
для управления запросом к
базе данных.


Когда 
CrimeFragment
запрашивает из базы преступление с
заданным идентификатором, его 
CrimeDetailViewModel
должна запустить запрос к базе данных 
getCrime(UUID)
.
После выполнения запроса 
CrimeDetailViewModel
должна
уведомить 
CrimeFragment
и пройтись по объекту
преступления, который возник в результате запроса.
Создайте новый класс под именем 
CrimeDetailViewModel
и откройте свойство 
LiveData
для сохранения объекта 
Crime
,
полученного из базы данных. Используйте 
LiveData
для
реализации 
отношений, 
при 
которых 
изменение
идентификатора преступления вызывает новый запрос к базе
данных.
Листинг 12.9. Добавление ViewModel в CrimeFragment
(CrimeDetailViewModel.kt)
class CrimeDetailViewModel() : ViewModel() {
private 
val 
crimeRepository 
=
CrimeRepository.get()
private 
val 
crimeIdLiveData 
=
MutableLiveData()
var crimeLiveData: LiveData =
Transformations.switchMap(crimeIdLiveDa
ta) { crimeId ->
crimeRepository.getCrime(crimeId)
}
fun loadCrime(crimeId: UUID) {
crimeIdLiveData.value = crimeId
}


}
В свойстве 
CrimeRepository
хранится связь с
CrimeRepository
. Сейчас в этом нет необходимости, но в
дальнейшем 
CrimeDetailViewModel
будет
взаимодействовать с репозиторием более чем в одном месте,
поэтому свойство окажется полезным.
CrimeIdLiveData
хранит идентификатор отображаемого в
данный момент преступления (или выводимого на
отображение) фрагментом 
CrimeFragment
. При первом
создании 
CrimeDetailViewModel
идентификатор
преступления не устанавливается. В конце концов
CrimeFragment
вызовет 
функцию
CrimeDetailViewModel.loadCrime(UUID)

чтобы
ViewModel
понял, какое преступление ему нужно загрузить.
Обратите внимание, что вы явно определили тип
crimeLiveData
как 
LiveData

Поскольку
crimeLiveData
публичен, нужно убедиться, что речь не идет о
MutableLiveData

ViewModel
-и никогда не должны
выставлять публично 
MutableLiveData
.
Может 
показаться 
странным 
метод 
обертывания
идентификатора преступления в 
LiveData
, так как он является
приватным для 
CrimeDetailViewModel
. Вы можете спросить:
что именно в 
CrimeDetailViewModel
отслеживает изменения
значения приватного идентификатора?
Ответ 
заключается 
в 
операторе 
Transformation
(преобразование). Преобразование данных в реальном времени —
это способ установить отношения «триггер — ответ» между
двумя объектами 
LiveData
. Функция преобразования
принимает два объекта: объект 
LiveData
, используемый в
качестве триггера, и функцию отображения, которая должна
вернуть 
объект 
LiveData

Функция 
преобразования


возвращает новый объект 
LiveData
, который мы называем
результатом преобразования, значение которого обновляется
каждый раз, когда изменяется значение триггерного объекта
LiveData
.
Значение результата преобразования вычисляется путем
выполнения функции отображения. Свойство 
value
объекта
LiveData

возвращаемое 
из 
функции 
отображения,
используется для установки свойства 
value
для результата
преобразования.
Такое использование преобразования означает, что
фрагмент 
CrimeFragment
должен лишь однажды наблюдать
открытые данные 
CrimeDetailViewModel.crimeLiveData
.
Когда фрагмент изменяет идентификатор, который он хочет
отобразить, 
ViewModel
просто публикует новые данные о
преступлении в существующем потоке данных.
Откройте файл 
CrimeFragment.kt
. Проассоциируйте
CrimeFragment
с 
CrimeDetail 
ViewModel
. Запросите у
ViewModel
загрузку 
Crime
в 
onCreate(...)
.

Download 21,53 Mb.

Do'stlaringiz bilan baham:
1   ...   196   197   198   199   200   201   202   203   ...   485




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish