如何在用户注销时清除存储库缓存



我有一个存储库,它包含StateFlow中的内存缓存列表。问题是,每当用户注销并登录到另一个帐户时,前一个用户的旧数据仍然存在。

object Repository {
private lateinit var remoteDataSource: RemoteDataSource
operator fun invoke(remoteDataSource: remoteDataSource) {
this.remoteDataSource = remoteDataSource
return this
}
private val myList = MutableStateFlow(listOf<myData>())
suspend fun getData(): Flow<List<myData>> =
withContext(Dispatchers.IO) {
if (myList.value.isEmpty()) {
val response = remoteDataSource.getData()
if (response != null) {
myList.value = response.map { it.toMyData() }
}
}
myList
}
suspend fun addData(newData: MyData) =
withContext(Dispatchers.IO) {
myList.value = myList.value.plus(newData)
remoteDataSource.addData(myData.toMyDataRequest())
}
}

此存储库由多个ViewModel使用。列表本身只能由一个屏幕观察(我们称之为myFragment(,但其他屏幕可以向其添加新元素。我曾尝试在myFragment's onDestroyView上清除存储库,但每当用户离开myFragments时(即使不是注销(,它都会清除列表。

我们可以观察用户何时在userRepository中注销,但我不知道如何从另一个存储库中观察一个存储库中的数据(没有什么能像viewModelScope.slaunch那样收集流或类似的东西(。

可以使用什么方法来解决这个问题?它将如何清除列表?

我不知道如何从另一个存储库中观察一个存储库中的数据

我认为在这种情况下你不应该这样做。

您有一个用例:注销。

当您调用这个用例时,您应该执行应用程序所需的所有必要操作。在这种情况下,您应该打电话给您的存储库,让它知道。

suspend fun clearData() =
withContext(Dispatchers.IO) {
// clear your data
}

我认为您不应该对Dispatcher进行硬编码,因为您可能会在某个时候对此进行测试;在测试中,您将使用TestDispatcher或类似的工具,如果您对其进行硬编码,测试将更加困难。你写测试,对吧?

所以现在您的用例。。

class LogoutUseCase(repo: YourRepo) {
operator fun invoke() { 
repo.clearData()
//do the logout
}
}

我就是这么想的。所有这些的作用域是启动注销的UI。。。

最新更新