相关疑难解决方法(0)

如何在依赖于视图模型的可组合函数中进行预览?

问题描述

HomeScreen我想在预览功能中预览可组合功能HomeScreenPrevieiw。但是这是不可能的,因为我收到以下错误:

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.<init>(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)
    ...
Run Code Online (Sandbox Code Playgroud)

我的代码

这是我的HomeScreen代码:

@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) }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的预览功能的代码:

@Preview
@Composable …
Run Code Online (Sandbox Code Playgroud)

android android-viewmodel android-jetpack-compose

12
推荐指数
1
解决办法
7124
查看次数

如何将 id 和应用程序传递给 Jetpack Compose 中的 viewModel/viewModelFactory?

我使用 Jetpack Compose 和导航撰写,我想将 id 传递给此viewmodel

class RecallViewModel(private val id:Long,application: Application):AndroidViewModel(application) {
  ............................
}

Run Code Online (Sandbox Code Playgroud)

可组合函数:

我不知道如何获得application可组合函数:

@Composable
fun RecallScreen(
    id:Long,
    onEnd:() -> Unit
){
       val recallViewModel = viewModel(factory = RecallViewModelFactory(
id = id,application = "i don't know how to get application"))

}

Run Code Online (Sandbox Code Playgroud)

和工厂

class RecallViewModelFactory(private val id:Long,val application: Application):ViewModelProvider.AndroidViewModelFactory(application) {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return RecallViewModel(id,application) as T
    }
}
Run Code Online (Sandbox Code Playgroud)

        composable(
            "${Routes.recall}/{id}",
            arguments = listOf(navArgument("id") { type = NavType.LongType })
        ) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-navigation android-jetpack-compose

9
推荐指数
1
解决办法
9572
查看次数

Jetpack Compose 在方向改变时保存状态

我正在使用 Android Jetpack 的 Compose,并且一直在尝试弄清楚如何保存方向更改的状态。

我的思路是让一个类成为一个 ViewModel。因为当我使用 Android 的传统 API 时,这通常有效。

当信息发生更改时,我使用了 remember {} 和 mutableState {} 来更新 UI。请验证我的理解是否正确...

记住 = 保存变量并允许通过 .value 访问,这允许缓存值。但它的主要用途是在更改时不重新分配变量。

mutableState = 在发生变化时更新变量。

许多博客文章都说要使用@Model,但是,在尝试该方法时,导入会出错。所以,我添加了一个: ViewModel()

但是,我相信我记得 {} 阻止它按预期工作?

我能在正确的方向上得到一个点吗?

@Composable
fun DefaultFlashCard() {

    val flashCards = remember { mutableStateOf(FlashCards())}
    

    Spacer(modifier = Modifier.height(30.dp))

    MaterialTheme {


        val typography = MaterialTheme.typography
        var question = remember { mutableStateOf(flashCards.value.currentFlashCards.question) }



        Column(modifier = Modifier.padding(30.dp).then(Modifier.fillMaxWidth())
                .then(Modifier.wrapContentSize(Alignment.Center))
                .clip(shape = RoundedCornerShape(16.dp))) {
            Box(modifier = Modifier.preferredSize(350.dp)
                    .border(width = 4.dp,
                            color = Gray,
                            shape = RoundedCornerShape(16.dp))
                    .clickable( …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-viewmodel android-jetpack android-jetpack-compose

1
推荐指数
2
解决办法
3861
查看次数