[英]How to cache data on Android using Jetpack Compose
假设我有 3 个屏幕,
HomeScreen
,其中包含用户列表UserProfileScreen
,其中包含用户详细信息及其帖子PostDetailScreen
,其中包含有关帖子的详细信息@Composable
fun HomeScreen() {
LazyColumn {
// Show user profiles
}
}
@Composable
fun UserProfileScreen(
userId: Long,
userProfileViewModel: UserProfileViewModel
) {
LaunchedEffect(Unit) {
userProfileViewModel.getProfileAndPosts(userId)
}
UserProfileView()
LazyColumn {
// Show posts
}
}
@Composable
fun PostDetailScreen(
postId: Long,
postViewModel: PostViewModel
) {
LaunchedEffect(Unit) {
postViewModel.getPost(postId)
}
PostView()
}
当我从HomeScreen
移动到UserProfileScreen
时,我使用LaunchedEffect(Unit) {}
从网络中获取用户个人资料和帖子。 如果我点击任何帖子,它将导航到PostDetailScreen
并显示帖子详细信息。
现在,如果我回到UserProfileScreen
(通过 backpress),它将重新获取用户数据,因为getProfileAndPosts()
是 function 并接受userId
所以(我猜)不能缓存到viewModelScope
(如果它是变量而没有任何参数,我们可以缓存它)
我该如何避免呢? Instagram 似乎正是这样做的。 它不会重新获取数据。 虽然,它们在 XML 视图上,但应该没有任何区别。
如果我正确理解您的问题
您必须使用 ViewModel。 并使用此名称定义数据 class:
data class UserProfileState(
val wereThePostsReceived : Boolean = false,
val posts : List<Post> = emptyList()
)
并在 ViewModel 中成功接收帖子后将其值更改为 true。
fun getProfileAndPosts(userId : String) {
viewModelScope.launch {
val result = getPostsUseCase(userId)
when(result) {
is Succuss -> {
state = state.copy(
wereThePostsReceived = true,
posts = // your interactor , usecase result
)
is Failed -> {
}
}
}
然后在 Compose 布局中使用它,如下所示:
LaunchedEffect(wereThePostsReceived) {
if(wereThePostsReceived == false){
postViewModel.getProfileAndPosts(postId)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.