From 3b1dc0a03f276edfa5ab32b1b95df6b595cda428 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Fri, 8 May 2026 18:38:14 +0800 Subject: [PATCH] =?UTF-8?q?refactor(activity):=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E5=90=84=E5=85=A5=E5=8F=A3=E4=BC=A0=20FoodRecord=20=E8=B7=B3?= =?UTF-8?q?=E8=BD=AC=20PrepareFoodActivity=EF=BC=8C=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E8=8F=9C=E5=93=81=E8=AF=A6=E6=83=85=E5=8A=A0=E8=BD=BD=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/shuwei/dish/match/net/NetViewModel.kt | 4 + .../dish/match/ui/CookingModeActivity.kt | 1 - .../dish/match/ui/FoodSearchActivity.kt | 10 +- .../dish/match/ui/PrepareFoodActivity.kt | 91 ++++++++++--------- .../dish/match/ui/SamplingModeActivity.kt | 2 +- .../match/ui/fragment/FoodListFragment.kt | 2 +- 6 files changed, 58 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/com/shuwei/dish/match/net/NetViewModel.kt b/app/src/main/java/com/shuwei/dish/match/net/NetViewModel.kt index ca960ac..fe05810 100644 --- a/app/src/main/java/com/shuwei/dish/match/net/NetViewModel.kt +++ b/app/src/main/java/com/shuwei/dish/match/net/NetViewModel.kt @@ -51,6 +51,10 @@ class NetViewModel( } } + fun resetFoodDetailState() { + _foodDetailState.value = UiState.Idle + } + /** * 搜索菜品列表的 UI 状态流,UI 层通过 collect 监听 */ 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 3a89329..1756caa 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 @@ -117,7 +117,6 @@ class CookingModeActivity : BaseActivity() { return } startActivity { - putExtra(FoodSearchActivity.PAGE_TYPE, 1) putExtra(FoodSearchActivity.DINNER_TYPE, dinnerType) putExtra(FoodSearchActivity.FOOD_NAME, searchText) } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/FoodSearchActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/FoodSearchActivity.kt index f85ccef..1b746e3 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/FoodSearchActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/FoodSearchActivity.kt @@ -17,6 +17,7 @@ import com.shuwei.dish.match.databinding.LayoutEmptyViewBinding import com.shuwei.dish.match.entity.FoodRecord import com.shuwei.dish.match.net.UiState import com.shuwei.dish.match.utils.KeyboardUtil +import com.shuwei.dish.match.utils.SpTool import com.shuwei.dish.match.utils.ext.addOnActionSearchListener import com.shuwei.dish.match.utils.ext.gone import com.shuwei.dish.match.utils.ext.startActivity @@ -32,7 +33,7 @@ class FoodSearchActivity : BaseActivity() { companion object { private const val TAG = "FoodSearchActivity" - const val PAGE_TYPE = "pageType" + const val FOOD_ITEM = "foodItem" const val FOOD_ID = "foodId" const val FOOD_NAME = "foodName" const val DINNER_TYPE = "dinnerType" @@ -41,13 +42,12 @@ class FoodSearchActivity : BaseActivity() { private lateinit var binding: ActivityFoodSearchBinding private var list: MutableList = mutableListOf() - private var pageType = 0 private var dinnerType = "1" private val recordAdapter by lazy { Food2Adapter(list).apply { isStateViewEnable = true setOnItemClickListener { adapter, view, position -> - if (pageType == 1) { + if (SpTool.cookMode == 0) { val jumpItem = list[position].also { it.dinnerType = dinnerType } startActivity { putExtra(PrepareFoodActivity.FOOD_ITEM, jumpItem as Serializable) @@ -55,8 +55,7 @@ class FoodSearchActivity : BaseActivity() { return@setOnItemClickListener } setResult(RESULT_OK, Intent().apply { - putExtra(FOOD_ID, list[position].foodId) - putExtra(FOOD_NAME, list[position].foodName) + putExtra(FOOD_ITEM, list[position] as Serializable) }) finish() } @@ -69,7 +68,6 @@ class FoodSearchActivity : BaseActivity() { super.onCreate(savedInstanceState) binding = ActivityFoodSearchBinding.inflate(layoutInflater) setContentView(binding.root) - pageType = intent.getIntExtra(PAGE_TYPE, 0) dinnerType = intent.getStringExtra(DINNER_TYPE) ?: "0" setHeaderBackground() foodName = intent.getStringExtra(FOOD_NAME) diff --git a/app/src/main/java/com/shuwei/dish/match/ui/PrepareFoodActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/PrepareFoodActivity.kt index f4739ff..c0f1394 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/PrepareFoodActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/PrepareFoodActivity.kt @@ -10,6 +10,7 @@ import android.view.MotionEvent import android.view.View import android.view.ViewGroup import androidx.activity.addCallback +import androidx.core.content.IntentCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle @@ -57,7 +58,6 @@ class PrepareFoodActivity : BaseActivity() { companion object { const val TAG = "CookActivity" const val FOOD_ITEM = "foodItem" - const val FOOD_NAME = "foodName" const val PAGE_FROM = "pageFrom" const val HOME = "home" const val WEIGHT_CHANGE_VALUE = 15 @@ -73,9 +73,6 @@ class PrepareFoodActivity : BaseActivity() { private var food: FoodRecord? = null - /** 采集模式下通过搜索页回填的 foodId */ - private var foodId: String? = null - /** 来源页面标识,HOME 时返回跳转 SamplingListActivity */ private var pageFrom: String? = null @@ -85,8 +82,8 @@ class PrepareFoodActivity : BaseActivity() { setContentView(binding.root) setHeaderBackground() pageFrom = intent.getStringExtra(PAGE_FROM) - food = intent.extras?.getSerializable(FOOD_ITEM) as FoodRecord? - + //food = intent.extras?.getSerializable(FOOD_ITEM) as FoodRecord? + food = IntentCompat.getSerializableExtra(intent, FOOD_ITEM, FoodRecord::class.java) val isSamplingMode = SpTool.cookMode == 1 val titleText = if (isSamplingMode) "菜品采集" else "菜品制作" setTitleBar(titleBarAction = { @@ -100,16 +97,21 @@ class PrepareFoodActivity : BaseActivity() { onBackPressedDispatcher.onBackPressed() } }) - + food?.let { + binding.etInputDish.run { + setText(it.foodName) + tag = it.foodName + } + } // 根据 cookMode 设置搜索栏可编辑性 if (isSamplingMode) { // 采集模式:可编辑,支持搜索 - val foodName = intent.getStringExtra(FOOD_NAME) - binding.etInputDish.setText(foodName ?: food?.foodName ?: "") binding.ivDishSearch.visible() + binding.etInputDish.let { + it.setSelection(it.length()) + } } else { // 制作模式:不可编辑,仅展示菜名 - binding.etInputDish.setText(food?.foodName ?: "") binding.etInputDish.isFocusable = false binding.etInputDish.isFocusableInTouchMode = false binding.ivDishSearch.gone() @@ -121,8 +123,8 @@ class PrepareFoodActivity : BaseActivity() { initRecyclerView() initObserver() - if (!isSamplingMode) { - getDishDetail() + if (food?.foodId.isNullOrBlank().not()) { + getDishDetail(food!!.foodId!!) } } @@ -167,10 +169,11 @@ class PrepareFoodActivity : BaseActivity() { toast("菜品构成信息未设置") return@clickWithDebounce } - val foodRecord = FoodRecord() + val foodRecord = food ?: FoodRecord() binding.etInputDish.let { - if (it.tag != null && it.tag.toString() == it.text.toString()) { - foodRecord.foodId = foodId + if (it.tag == null || it.tag.toString() != it.text.toString()) { + // 输入框内容与回填名称不一致,说明用户手动修改了菜名,清除 foodId + foodRecord.foodId = null } } foodRecord.foodName = showFoodName @@ -329,31 +332,25 @@ class PrepareFoodActivity : BaseActivity() { private fun initObserver() { lifecycleScope.launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - netViewModel.foodDetailState.collect { state -> - when (state) { - is UiState.Success -> { - // 防止 StateFlow 重放导致 list 被重复清空 - if (isDetailLoaded) return@collect - val detail = state.data - if (detail == null) { - toast("查询菜品信息为空") - return@collect - } - isDetailLoaded = true - loadDishDetail(detail) + netViewModel.foodDetailState.collect { state -> + when (state) { + is UiState.Success -> { + val detail = state.data + if (detail == null) { + toast("查询菜品信息为空") + return@collect } - - is UiState.Error -> toast(state.msg) - else -> {} + loadDishDetail(detail) } + is UiState.Error -> toast(state.msg) + else -> {} } } } } - private fun getDishDetail() { - netViewModel.getFoodDetail(food?.foodId ?: "") + private fun getDishDetail(foodId: String) { + netViewModel.getFoodDetail(foodId) } @@ -366,14 +363,16 @@ class PrepareFoodActivity : BaseActivity() { // 筛选出主材和辅材,转换为 GoodsItem(useWeight 置零) val tempData = voList.filter { it.materialType == 1 || it.materialType == 2 } .map { it.toGoodsItem().also { item -> item.useWeight = 0.0 } } + // 直接替换 adapter.items,确保 adapter 数据源被完全替换 + // 同时同步外部 list,保证后续 updateMaterialTypes/removeFood 等操作正确 list.clear() - firstReqSize = list.size list.addAll(tempData) + materialAdapter.items = list materialAdapter.notifyDataSetChanged() + firstReqSize = list.size } private var firstReqSize = 0 - private var isDetailLoaded = false private val list = mutableListOf() private val materialAdapter by lazy { FoodMaterialAdapter(list).apply { @@ -627,19 +626,25 @@ class PrepareFoodActivity : BaseActivity() { toast(binding.etInputDish.hint.toString()) return } - val intent = Intent(this, FoodSearchActivity::class.java).apply { + val launchIntent = Intent(this, FoodSearchActivity::class.java).apply { putExtra(FoodSearchActivity.FOOD_NAME, searchContent) } - startActivity(intent) { - foodId = it?.getStringExtra(FoodSearchActivity.FOOD_ID) - val name = it?.getStringExtra(FoodSearchActivity.FOOD_NAME) - Log.d(TAG, "jumpSearch: foodId=$foodId, name=$name") - if (name.isNullOrBlank()) return@startActivity + startActivity(launchIntent) { resultIntent -> + if (resultIntent == null) return@startActivity + food = IntentCompat.getSerializableExtra(resultIntent, FOOD_ITEM, FoodRecord::class.java) + Log.d(TAG, "jumpSearch: record=$food") + if (food == null) return@startActivity + // 将搜索结果写入 food,保留 cookMode + food!!.cookMode = 1 binding.etInputDish.run { - setText(name) - tag = name + setText(food!!.foodName) + tag = food!!.foodName setSelection(text.length) } + // 有 foodId 时请求菜品构成 + if (!food!!.foodId.isNullOrBlank()) { + getDishDetail(food!!.foodId!!) + } } hideKeyboard() } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/SamplingModeActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/SamplingModeActivity.kt index 5615487..7a45667 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/SamplingModeActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/SamplingModeActivity.kt @@ -186,7 +186,7 @@ class SamplingModeActivity : BaseActivity() { return } startActivity { - putExtra(PrepareFoodActivity.FOOD_NAME, item.foodName) + putExtra(PrepareFoodActivity.FOOD_ITEM, item as Serializable) } } 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 551fd37..9505c62 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 @@ -78,7 +78,7 @@ class FoodListFragment : BaseFragment() { } item.dinnerType = dinnerType activity.startActivity { - putExtra(SubmitFoodActivity.FOOD_ITEM, item as Serializable) + putExtra(PrepareFoodActivity.FOOD_ITEM, item as Serializable) } }