问题陈述:我希望通过这段代码我可以将列表数据第一个屏幕共享到另一个屏幕。
堆栈跟踪
java.lang.IllegalArgumentException:与请求 NavDeepLinkRequest 匹配的导航目标{ uri=android-app://androidx.navigation/post/filter/SnapshotStateList(value=[/storage/emulated/0/Android/media/com.whatsapp/ WhatsApp/媒体/WhatsApp 图片/IMG-20240201-WA0010.jpg,/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp 视频/VID-20240210-WA0001.mp4,/storage/emulated/ 0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp 视频/VID-20240210-WA0002.mp4,/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp 视频/VID-20240210 -WA0000.mp4])@57386330 } 在导航图中找不到 ComposeNavGraph(0x0) startDestination={Destination(0x78d845ec) route=home} 在 androidx.navigation.NavController.navigate(NavController.kt:1815) 在 androidx.navigation.NavController.navigate(NavController.kt:2221) 在 androidx.navigation.NavController.navigate$default(NavController.kt:2216) 在 com.sociallab.feature.post.createPost.PostCreateScreenKt$PostCreateScreen$1$2.invoke(PostCreateScreen.kt:95) 在 com.sociallab.feature.post.createPost.PostCreateScreenKt$PostCreateScreen$1$2.invoke(PostCreateScreen.kt:91) 在 androidx.compose.foundation.ClickableNode$clickPointerInput$3.invoke-k-4lQ0M(Clickable.kt:655)
主要活动.kt
@Composable
private fun MyNavigationHost(
modifier: Modifier,
navController: NavHostController,
) {
NavHost(
navController,
modifier = modifier,
startDestination = AppRoute.Home.route
) {
postNavGraph(navController)
}
}
postNavGraph.kt
fun NavGraphBuilder.postNavGraph(
navController: NavHostController,
) {
composable(PostRoute.Create.route) {
PostCreateScreen(
navController,
hiltViewModel()
)
}
composable(PostRoute.Filter.route) {
FilterPostScreen(
navController,
hiltViewModel()
)
}
}
PostRoute.kt
sealed class PostRoute(route: String, routePlaceholder: String) : AppRoute(route, routePlaceholder) {
data object Create : PostRoute("$PREFIX/create","$PREFIX/create" )
data object Filter : PostRoute("$PREFIX/filter","$PREFIX/filter")
data object Final:PostRoute("$PREFIX/final","$PREFIX/final")
data object Music:PostRoute("$PREFIX/music","$PREFIX/music")
// data class MediaList: PostRoute("$PREFIX/filter","$PREFIX/filter")
// data object MediaList(val data: List<String>) : PostRoute("$PREFIX/filter/$data","$PREFIX/filter/data")
/*data class MediaList(val data: List<String>) : PostRoute("$PREFIX/filter/{${data}}", "$PREFIX/filter/{${data}}")*/
}
ViewModel.kt
@HiltViewModel
class MediaViewModel @Inject constructor() : ViewModel() {
private val _selectedMediaList = MutableStateFlow<List<String>>(emptyList())
val selectedMediaList: StateFlow<List<String>> = _selectedMediaList
fun updateSelectedMedia(media: List<String>) {
_selectedMediaList.value = media
}
}
屏幕A.kt 在“下一步”按钮上单击“监听器”
viewModel.updateSelectedMedia(selectedMediaList)
// navController.navigate(PostRoute.MediaList(selectedMediaList).route)
navController.navigate(PostRoute.Filter.route)
屏幕B.kt 获取数据
val selectedMediaList by viewModel.selectedMediaList.collectAsState()
// Update the ViewModel when selectedMediaList changes
LaunchedEffect(selectedMediaList) {
viewModel.updateSelectedMedia(selectedMediaList)
}
根据堆栈跟踪: NavDeepLinkRequest{ uri=android-app://androidx.navigation/post/filter/SnapshotStateList... 在导航图中找不到 ComposeNavGraph
看起来你也在在导航参数中传递列表。确保您没有将列表传递到那里。
如果您需要在这两个屏幕之间共享列表,您需要在两个屏幕中传递相同的视图模型实例。
hiltViewModel() 每次都会创建一个新实例,这就是为什么你会在每个屏幕中看到一个空列表。
因此您需要创建视图模型的单个实例并将其作为参数传递到像这样的屏幕中。
fun NavGraphBuilder.postNavGraph(
navController: NavHostController,
) {
val viewModel: MediaViewModel = hiltViewModel() // A single viewmodel instance here
composable(PostRoute.Create.route) {
PostCreateScreen(
navController,
viewModel
)
}
composable(PostRoute.Filter.route) {
FilterPostScreen(
navController,
viewModel
)
}
}
您可以在任意数量的屏幕中使用此视图模型并保存数据,因为它基本上是相同的实例。