繁体   English   中英

如何使用 Jetpack Compose 在 Android 上缓存数据

[英]How to cache data on Android using Jetpack Compose

假设我有 3 个屏幕,

  1. HomeScreen ,其中包含用户列表
  2. UserProfileScreen ,其中包含用户详细信息及其帖子
  3. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM