无法解析列表<String>数据屏幕A到屏幕B。在两个屏幕中使用相同的Viewmodel

问题描述 投票:0回答:1

问题陈述:我希望通过这段代码我可以将列表数据第一个屏幕共享到另一个屏幕。

堆栈跟踪

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)
    }
android kotlin navigation android-jetpack-compose
1个回答
0
投票

根据堆栈跟踪: 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
        )
    }
}

您可以在任意数量的屏幕中使用此视图模型并保存数据,因为它基本上是相同的实例。

© www.soinside.com 2019 - 2024. All rights reserved.