fix(activity): 修复采样页越界崩溃、重复路由及搜索返回清空输入框问题

This commit is contained in:
2026-04-30 15:42:44 +08:00
parent 5e46c21469
commit 9cfc481cf3
4 changed files with 19 additions and 24 deletions
@@ -33,6 +33,7 @@ class InitActivity : BaseActivity() {
}
private lateinit var binding: ActivityInitBinding
private var hasNavigated = false // 防止 onResume 多次触发重复路由
private var startTime = 0L // 倒计时开始时间
private var lastNetworkCheckTime = 0L // 上次检测网络的时间
private val countdownHandler = Handler(Looper.getMainLooper())
@@ -92,6 +93,8 @@ class InitActivity : BaseActivity() {
private fun startNextPage(withDelay: Boolean = false) {
if (hasNavigated) return
hasNavigated = true
lifecycleScope.launch {
if (withDelay) delay(2000)
// 子设备:直接进入小屏专属页面,不走原有大屏业务流程
@@ -31,6 +31,7 @@ import com.shuwei.dish.match.utils.SpTool
import com.shuwei.dish.match.utils.WeightUtil
import com.shuwei.dish.match.utils.ext.addOnActionSearchListener
import com.shuwei.dish.match.utils.ext.clickWithDebounce
import com.shuwei.dish.match.utils.ext.dp
import com.shuwei.dish.match.utils.ext.gone
import com.shuwei.dish.match.utils.ext.startActivity
import com.shuwei.dish.match.utils.ext.toJsonString
@@ -417,18 +418,11 @@ class PrepareFoodActivity : BaseActivity() {
return SwipeMenuItem(this).apply {
setImage(R.drawable.ic_trash_white)
setBackground(R.drawable.bg_swipe_delete)
width = dp2px(160)
width = 160.dp
height = ViewGroup.LayoutParams.MATCH_PARENT
}
}
/**
* dp 转 px
*/
private fun dp2px(dp: Int): Int {
return (dp * resources.displayMetrics.density + 0.5f).toInt()
}
override fun onResume() {
super.onResume()
pageVisible = true
@@ -615,6 +609,8 @@ class PrepareFoodActivity : BaseActivity() {
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
binding.etInputDish.run {
setText(name)
tag = name
@@ -165,22 +165,19 @@ class SamplingModeActivity : BaseActivity() {
private val dishAdapter by lazy {
FoodListAdapter(list = list, mode = FoodListAdapter.DisplayMode.SAMPLING_MODE).apply {
isStateViewEnable = true
onItemClick = { position ->
judgeDeviceConfig {
onItemClick(position)
}
onItemClick = onItemClick@{ position ->
// 在点击时立即捕获 item,避免协程挂起期间 list 刷新导致越界
val item = list.getOrNull(position) ?: return@onItemClick
judgeDeviceConfig { onItemClick(item) }
}
}
}
private fun onItemClick(position: Int) {
val item = list[position]
private fun onItemClick(item: FoodRecord) {
if (item.isCooking) {
// 烹饪中,跳到称熟重页面
startActivity<SubmitFoodActivity> {
putExtra(
SubmitFoodActivity.FOOD_ITEM, item as Serializable
)
putExtra(SubmitFoodActivity.FOOD_ITEM, item as Serializable)
}
return
}
@@ -221,7 +218,9 @@ class SamplingModeActivity : BaseActivity() {
}
// item 点击事件
setOnItemClickListener { _, position ->
judgeDeviceConfig { onItemClick(position) }
// 在点击时立即捕获 item,避免协程挂起期间 list 刷新导致越界
val item = list.getOrNull(position) ?: return@setOnItemClickListener
judgeDeviceConfig { onItemClick(item) }
}
adapter = dishAdapter
}
@@ -23,6 +23,7 @@ import com.shuwei.dish.match.net.UiState
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.utils.ext.startActivity
import com.shuwei.dish.match.utils.ext.toast
import com.yanzhenjie.recyclerview.SwipeMenuItem
@@ -140,15 +141,11 @@ class DishListFragment : BaseFragment<FragmentDishListBinding>() {
return SwipeMenuItem(context).apply {
setImage(R.drawable.ic_trash_white)
setBackground(R.drawable.bg_swipe_delete)
width = dp2px(context, 160)
width = 160.dp
height = ViewGroup.LayoutParams.MATCH_PARENT
}
}
private fun dp2px(context: Context, dp: Int): Int {
return (dp * context.resources.displayMetrics.density + 0.5f).toInt()
}
/**
* 用 combine 同时监听网络结果与本地数据,网络成功时统一合并渲染
* pageNo > 1(加载更多)时 cookFoodListState 不参与合并,直接追加网络数据