所有数据均来自服务器批量。我无法影响它的音量。因此,为了减少请求数量,我将此数据存储在单个 ViewModel 中,并在所有屏幕上共享。我知道这不是很有效。但我还没有其他想法。展望未来,我想警告您,由于可能会从其他设备更改这些数据,因此将这些数据存储在 DataStore 或 Room 中是没有意义的。因此,当在屏幕之间切换时,我会创建数据的副本并过滤数据以将其显示在屏幕上。
rooms.filter { it.id == roomId }
也许使用 Room 作为缓存?每次启动时都更新其中的数据吗?忘记添加 - 目标操作系统是 WearOS。
无需使用
DataStore
或Room
。您可以使用Repository pattern
。
在此,您只需将数据存储在存储库中,然后您就可以在整个应用程序中使用它,但是当您终止应用程序时,它不会保留数据,您必须在每次应用程序启动时获取数据。
这是解释存储库模式的图像。
这是一个实现它的简短示例,您可以根据您的要求使用它。
存储库:
class UserRepository {
private val users = mutableListOf<User>()
fun addUser(user: User) {
users.add(user)
}
fun addAllUsers(userList: List<User>) {
users.clear() // Clear existing data if needed
users.addAll(userList)
}
fun getAllUsers(): List<User> = users
}
视图模型:
class UserViewModel(private val repository: UserRepository) : ViewModel() {
private val _users = MutableLiveData<List<User>>()
val users: LiveData<List<User>> get() = _users
fun loadUsers() {
_users.value = repository.getAllUsers()
}
fun addUser(user: User) {
repository.addUser(user)
loadUsers() // Refresh the user list
}
fun storeFetchedUsers(fetchedUsers: List<User>) {
repository.addAllUsers(fetchedUsers)
loadUsers() // Refresh the user list
}
}
在Activity/Fragment中的用法:
class MainActivity : AppCompatActivity() {
private val userRepository = UserRepository()
private val viewModel: UserViewModel by viewModels { ViewModelFactory(userRepository) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Simulate fetching data from an API
val fetchedUsers = listOf(User(1, "John Doe"), User(2, "Jane Smith"))
viewModel.storeFetchedUsers(fetchedUsers) // Store the fetched users
viewModel.users.observe(this) { users ->
// Update UI with user data
}
}
}