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

How to clear repository cache when the user logs out?

我有一个存储库,其中包含 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 的 onDestroyView 上的存储库,但只要用户离开 myFragment(即使不是注销),它也会清除列表。

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

有什么方法可以解决这个问题?它会如何清除列表?

i don't know how to observe data in one repository from another repository

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

您有一个use-case:注销。

当您调用此 use-case 时,您应该执行您的应用所需的所有必要操作。在这种情况下,您应该调用您的存储库让它知道。

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

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

现在你的用例..

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

我就是这么想的。 所有这些的范围是启动注销的 UI...