From 120f5432de0de2a7e625c78822baaf8d7dad6d6f Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Wed, 13 May 2026 17:24:31 +0800 Subject: [PATCH] =?UTF-8?q?refactor(fragment):=20FoodListFragment=20?= =?UTF-8?q?=E7=8B=AC=E7=AB=8B=E6=8C=81=E6=9C=89=20NetViewModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 每个 FoodListFragment 通过 by viewModels() 持有独立的 NetViewModel 实例, searchFoodState 各自隔离,不再共享 Activity 的 netViewModel。 - 删除 pendingDinnerType 字段及餐次过滤逻辑 - initObserver 改为收 Fragment 自身的 netViewModel.searchFoodState - getDishList 直接调 netViewModel.searchFoodList,不再经由 Activity 中转 - CookingModeActivity 删除 getFoodList() 透传方法 Co-Authored-By: Claude Sonnet 4.6 --- .../dish/match/ui/CookingModeActivity.kt | 4 ---- .../match/ui/fragment/FoodListFragment.kt | 23 +++++-------------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/shuwei/dish/match/ui/CookingModeActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/CookingModeActivity.kt index 5376185..4ce11a3 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/CookingModeActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/CookingModeActivity.kt @@ -196,8 +196,4 @@ class CookingModeActivity : BaseActivity() { isVisible = false } - public fun getFoodList(param: MutableMap) { - netViewModel.searchFoodList(param = param) - } - } \ No newline at end of file diff --git a/app/src/main/java/com/shuwei/dish/match/ui/fragment/FoodListFragment.kt b/app/src/main/java/com/shuwei/dish/match/ui/fragment/FoodListFragment.kt index d63487f..6a92f22 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/fragment/FoodListFragment.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/fragment/FoodListFragment.kt @@ -24,9 +24,11 @@ import com.shuwei.dish.match.ui.CookingModeActivity import com.shuwei.dish.match.ui.PrepareFoodActivity import com.shuwei.dish.match.ui.SubmitFoodActivity import com.shuwei.dish.match.utils.ext.dp +import com.shuwei.dish.match.net.NetViewModel import com.shuwei.dish.match.utils.ext.startActivity import com.shuwei.dish.match.utils.ext.toast import com.yanzhenjie.recyclerview.SwipeMenuItem +import androidx.fragment.app.viewModels import java.io.Serializable import kotlinx.coroutines.launch @@ -45,6 +47,8 @@ class FoodListFragment : BaseFragment() { } } + private val netViewModel: NetViewModel by viewModels() + private var pageNo = 1 private val pageSize = 100 @@ -55,9 +59,6 @@ class FoodListFragment : BaseFragment() { /** 第一页时先查数据库存入此字段,网络结果回来后直接使用,避免时序问题 */ private var pendingLocalList: MutableList? = null - /** 记录本次请求对应的餐次,响应回来时比对,忽略非本 Fragment 发起的请求结果 */ - private var pendingDinnerType: String = "0" - private var list: MutableList = mutableListOf() private val dishAdapter by lazy { FoodListAdapter(list = list).apply { @@ -151,29 +152,19 @@ class FoodListFragment : BaseFragment() { } } - /** - * 只监听 searchFoodState,避免 cookFoodListState 变化触发重复渲染。 - * 第一页时使用 getDishList() 中预先查好的 pendingLocalList 参与合并;加载更多时直接追加。 - * 三个 Fragment 共享同一个 searchFoodState,通过 pendingDinnerType 过滤非本 Fragment 发起的请求。 - */ private fun initObserver() { viewLifecycleOwner.lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { - activity.netViewModel.searchFoodState.collect { networkState -> + netViewModel.searchFoodState.collect { networkState -> when (networkState) { is UiState.Loading -> activity.showLoading() is UiState.Success -> { - // 餐次不匹配,忽略(其他 Fragment 发起的请求) - if (dinnerType != pendingDinnerType) return@collect activity.delayDismissLoading() finishRefresh() - // 第一页使用预查好的本地数据合并;加载更多传 null 直接追加 val localList = if (pageNo == 1) pendingLocalList else null loadAndMergeDishList(networkState.data, localList) } is UiState.Error -> { - // 餐次不匹配,忽略 - if (dinnerType != pendingDinnerType) return@collect if (isAdded.not()) return@collect toast(networkState.msg) finishRefresh() @@ -241,9 +232,7 @@ class FoodListFragment : BaseFragment() { dinnerType = dinnerType ) } - // 记录本次请求的餐次,用于响应回来时过滤其他 Fragment 发起的请求 - pendingDinnerType = dinnerType - activity.getFoodList(param = param) + netViewModel.searchFoodList(param = param) } }