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) 我使用 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
我正在使用 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