Как получить предварительный просмотр в составных функциях, которые зависят от модели представления?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Как получить предварительный просмотр в составных функциях, которые зависят от модели представления?

Сообщение Anonymous »

Описание проблемы
Я хотел бы иметь предварительный просмотр компонуемой функции HomeScreen в функции предварительного просмотра HomeScreenPreviewiw. Однако это невозможно сделать, поскольку я получаю следующую ошибку:

Код: Выделить всё

java.lang.IllegalStateException: ViewModels creation is not supported in Preview
at androidx.compose.ui.tooling.ComposeViewAdapter$FakeViewModelStoreOwner$1.getViewModelStore(ComposeViewAdapter.kt:709)
at androidx.lifecycle.ViewModelProvider.(ViewModelProvider.kt:105)
at androidx.lifecycle.viewmodel.compose.ViewModelKt.get(ViewModel.kt:82)
at androidx.lifecycle.viewmodel.compose.ViewModelKt.viewModel(ViewModel.kt:72)
at com.example.crud.ui.screens.home.HomeScreenKt.HomeScreen(HomeScreen.kt:53)
at com.example.crud.ui.screens.home.HomeScreenKt.HomeScreenPreview(HomeScreen.kt:43)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
...
Мой код
Это мой код главного экрана:

Код: Выделить всё

@Composable
fun HomeScreen(
viewModel: HomeViewModel = hiltViewModel(),
navigateToDetailsAction: () -> Unit,
openCardDetailsAction: (Int) -> Unit
) {
val cities = viewModel.cities.observeAsState(listOf())
Scaffold(
topBar = { HomeAppBar() },
floatingActionButton = { HomeFab(navigateToDetailsAction) }
) {
HomeContent(cities) { id -> openCardDetailsAction(id) }
}
}
Это код моей функции предварительного просмотра:

Код: Выделить всё

@Preview
@Composable
private fun HomeScreenPreview() {
HomeScreen(navigateToDetailsAction = {}, openCardDetailsAction = {})
}
Моя модель представления:

Код: Выделить всё

@HiltViewModel
class HomeViewModel @Inject constructor(repository: CityRepository) : ViewModel() {
val cities: LiveData = repository.allCities.asLiveData()
}
Репозиторий:

Код: Выделить всё

@ViewModelScoped
class CityRepository @Inject constructor(appDatabase: AppDatabase) {
private val dao by lazy { appDatabase.getCityDao() }

val allCities by lazy { dao.getAllCities() }

suspend fun addCity(city: City) = dao.insert(city)

suspend fun updateCity(city: City) = dao.update(city)

suspend fun deleteCity(city: City) = dao.delete(city)

suspend fun getCityById(id: Int) = dao.getCityById(id)

}
База данных приложений:

Код: Выделить всё

@Database(entities = [City::class], version = 2, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
abstract fun getCityDao() : CityDao
}
Моя неудачная попытка
Я подумал, что проблема может быть в том, что модель представления передается в качестве параметра по умолчанию моего HomeScreen и поэтому я решил сделать это так:

Код: Выделить всё

@Composable
fun HomeScreen(
navigateToDetailsAction: () -> Unit,
openCardDetailsAction: (Int) -> Unit
) {
val viewModel: HomeViewModel = hiltViewModel()
val cities = viewModel.cities.observeAsState(listOf())
Scaffold(
topBar = { HomeAppBar() },
floatingActionButton = { HomeFab(navigateToDetailsAction) }
) {
HomeContent(cities) { id -> openCardDetailsAction(id) }
}
}
Но он по-прежнему не работает (я постоянно получаю ту же ошибку) и не подходит для тестирования, так как не позволяет мне протестировать мой HomeScreen с имитируемым представлением модель.

Подробнее здесь: https://stackoverflow.com/questions/690 ... view-model
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»