优化会话列表的数据加载和合并逻辑
- 在 `AndroidManifest.xml` 中添加 `com.android.vending.BILLING` 权限。 - 重构 `AllChatListScreen.kt` 的数据加载机制,通过 `LaunchedEffect` 监听各个 `ViewModel` 的列表变化,并自动合并数据。 - 将原有的数据刷新和合并逻辑拆分为 `refreshAllData` 和 `combineAllData` 两个函数,提高了代码的清晰度和复用性。 - 优化了下拉刷新和初次加载的逻辑,确保在所有数据源加载完成后才更新UI状态,提升了用户体验。
This commit is contained in:
@@ -8,6 +8,7 @@
|
|||||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
|
<uses-permission android:name="com.android.vending.BILLING" />
|
||||||
<uses-feature android:name="android.hardware.camera.any" android:required="false" />
|
<uses-feature android:name="android.hardware.camera.any" android:required="false" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ import androidx.compose.runtime.getValue
|
|||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
@@ -127,8 +130,8 @@ fun AllChatListScreen() {
|
|||||||
refreshing = true
|
refreshing = true
|
||||||
refreshAllData(context,
|
refreshAllData(context,
|
||||||
onSuccess = { conversations ->
|
onSuccess = { conversations ->
|
||||||
allConversations = conversations
|
// 数据合并会在 LaunchedEffect 中自动完成
|
||||||
refreshing = false
|
// refreshing 状态会在 LaunchedEffect 中更新
|
||||||
},
|
},
|
||||||
onError = { errorMsg ->
|
onError = { errorMsg ->
|
||||||
error = errorMsg
|
error = errorMsg
|
||||||
@@ -138,12 +141,44 @@ fun AllChatListScreen() {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// 监听各个 ViewModel 的列表变化,自动合并数据
|
||||||
|
LaunchedEffect(
|
||||||
|
AgentChatListViewModel.agentChatList,
|
||||||
|
GroupChatListViewModel.groupChatList,
|
||||||
|
FriendChatListViewModel.friendChatList,
|
||||||
|
AgentChatListViewModel.isLoading,
|
||||||
|
GroupChatListViewModel.isLoading,
|
||||||
|
FriendChatListViewModel.isLoading
|
||||||
|
) {
|
||||||
|
// 只有当所有 ViewModel 都完成加载后,才合并数据
|
||||||
|
val allLoaded = !AgentChatListViewModel.isLoading &&
|
||||||
|
!GroupChatListViewModel.isLoading &&
|
||||||
|
!FriendChatListViewModel.isLoading
|
||||||
|
|
||||||
|
// 如果所有 ViewModel 都已完成加载,合并数据
|
||||||
|
// 或者如果至少有一个列表有数据,也合并(处理部分数据已加载的情况)
|
||||||
|
val hasAnyData = AgentChatListViewModel.agentChatList.isNotEmpty() ||
|
||||||
|
GroupChatListViewModel.groupChatList.isNotEmpty() ||
|
||||||
|
FriendChatListViewModel.friendChatList.isNotEmpty()
|
||||||
|
|
||||||
|
if (allLoaded || hasAnyData) {
|
||||||
|
combineAllData(onSuccess = { conversations ->
|
||||||
|
allConversations = conversations
|
||||||
|
if (allLoaded) {
|
||||||
|
isLoading = false
|
||||||
|
refreshing = false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化时触发数据加载
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
isLoading = true
|
isLoading = true
|
||||||
refreshAllData(context,
|
refreshAllData(context,
|
||||||
onSuccess = { conversations ->
|
onSuccess = { conversations ->
|
||||||
allConversations = conversations
|
// 数据合并会在 LaunchedEffect 中自动完成
|
||||||
isLoading = false
|
// 这里只处理错误情况
|
||||||
},
|
},
|
||||||
onError = { errorMsg ->
|
onError = { errorMsg ->
|
||||||
error = errorMsg
|
error = errorMsg
|
||||||
@@ -369,11 +404,24 @@ fun refreshAllData(
|
|||||||
onError: (String) -> Unit
|
onError: (String) -> Unit
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
// 同时刷新所有类型的数据
|
// 同时刷新所有类型的数据(异步操作)
|
||||||
AgentChatListViewModel.refreshPager(context = context)
|
AgentChatListViewModel.refreshPager(context = context)
|
||||||
GroupChatListViewModel.refreshPager(context = context)
|
GroupChatListViewModel.refreshPager(context = context)
|
||||||
FriendChatListViewModel.refreshPager(context = context)
|
FriendChatListViewModel.refreshPager(context = context)
|
||||||
|
|
||||||
|
// 注意:由于 refreshPager 是异步的,数据合并会在 LaunchedEffect 中通过监听列表变化来完成
|
||||||
|
// 这里先立即合并一次当前已有的数据(如果有的话)
|
||||||
|
combineAllData(onSuccess)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
onError("刷新数据失败: ${e.message}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 合并所有类型的数据
|
||||||
|
fun combineAllData(
|
||||||
|
onSuccess: (List<CombinedConversation>) -> Unit
|
||||||
|
) {
|
||||||
|
try {
|
||||||
val combinedList = mutableListOf<CombinedConversation>()
|
val combinedList = mutableListOf<CombinedConversation>()
|
||||||
|
|
||||||
AgentChatListViewModel.agentChatList.forEach { agent ->
|
AgentChatListViewModel.agentChatList.forEach { agent ->
|
||||||
@@ -401,6 +449,6 @@ fun refreshAllData(
|
|||||||
|
|
||||||
onSuccess(sortedList)
|
onSuccess(sortedList)
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
onError("刷新数据失败: ${e.message}")
|
// 静默失败,让 LaunchedEffect 继续监听变化
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user