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 lateinit var binding: ActivityInitBinding
private var hasNavigated = false // 防止 onResume 多次触发重复路由
private var startTime = 0L // 倒计时开始时间 private var startTime = 0L // 倒计时开始时间
private var lastNetworkCheckTime = 0L // 上次检测网络的时间 private var lastNetworkCheckTime = 0L // 上次检测网络的时间
private val countdownHandler = Handler(Looper.getMainLooper()) private val countdownHandler = Handler(Looper.getMainLooper())
@@ -92,6 +93,8 @@ class InitActivity : BaseActivity() {
private fun startNextPage(withDelay: Boolean = false) { private fun startNextPage(withDelay: Boolean = false) {
if (hasNavigated) return
hasNavigated = true
lifecycleScope.launch { lifecycleScope.launch {
if (withDelay) delay(2000) 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.WeightUtil
import com.shuwei.dish.match.utils.ext.addOnActionSearchListener import com.shuwei.dish.match.utils.ext.addOnActionSearchListener
import com.shuwei.dish.match.utils.ext.clickWithDebounce 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.gone
import com.shuwei.dish.match.utils.ext.startActivity import com.shuwei.dish.match.utils.ext.startActivity
import com.shuwei.dish.match.utils.ext.toJsonString import com.shuwei.dish.match.utils.ext.toJsonString
@@ -417,18 +418,11 @@ class PrepareFoodActivity : BaseActivity() {
return SwipeMenuItem(this).apply { return SwipeMenuItem(this).apply {
setImage(R.drawable.ic_trash_white) setImage(R.drawable.ic_trash_white)
setBackground(R.drawable.bg_swipe_delete) setBackground(R.drawable.bg_swipe_delete)
width = dp2px(160) width = 160.dp
height = ViewGroup.LayoutParams.MATCH_PARENT height = ViewGroup.LayoutParams.MATCH_PARENT
} }
} }
/**
* dp 转 px
*/
private fun dp2px(dp: Int): Int {
return (dp * resources.displayMetrics.density + 0.5f).toInt()
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
pageVisible = true pageVisible = true
@@ -615,6 +609,8 @@ class PrepareFoodActivity : BaseActivity() {
startActivity(intent) { startActivity(intent) {
foodId = it?.getStringExtra(FoodSearchActivity.FOOD_ID) foodId = it?.getStringExtra(FoodSearchActivity.FOOD_ID)
val name = it?.getStringExtra(FoodSearchActivity.FOOD_NAME) val name = it?.getStringExtra(FoodSearchActivity.FOOD_NAME)
Log.d(TAG, "jumpSearch: foodId=$foodId, name=$name")
if (name.isNullOrBlank()) return@startActivity
binding.etInputDish.run { binding.etInputDish.run {
setText(name) setText(name)
tag = name tag = name
@@ -165,22 +165,19 @@ class SamplingModeActivity : BaseActivity() {
private val dishAdapter by lazy { private val dishAdapter by lazy {
FoodListAdapter(list = list, mode = FoodListAdapter.DisplayMode.SAMPLING_MODE).apply { FoodListAdapter(list = list, mode = FoodListAdapter.DisplayMode.SAMPLING_MODE).apply {
isStateViewEnable = true isStateViewEnable = true
onItemClick = { position -> onItemClick = onItemClick@{ position ->
judgeDeviceConfig { // 在点击时立即捕获 item,避免协程挂起期间 list 刷新导致越界
onItemClick(position) val item = list.getOrNull(position) ?: return@onItemClick
} judgeDeviceConfig { onItemClick(item) }
} }
} }
} }
private fun onItemClick(position: Int) { private fun onItemClick(item: FoodRecord) {
val item = list[position]
if (item.isCooking) { if (item.isCooking) {
// 烹饪中,跳到称熟重页面 // 烹饪中,跳到称熟重页面
startActivity<SubmitFoodActivity> { startActivity<SubmitFoodActivity> {
putExtra( putExtra(SubmitFoodActivity.FOOD_ITEM, item as Serializable)
SubmitFoodActivity.FOOD_ITEM, item as Serializable
)
} }
return return
} }
@@ -221,7 +218,9 @@ class SamplingModeActivity : BaseActivity() {
} }
// item 点击事件 // item 点击事件
setOnItemClickListener { _, position -> setOnItemClickListener { _, position ->
judgeDeviceConfig { onItemClick(position) } // 在点击时立即捕获 item,避免协程挂起期间 list 刷新导致越界
val item = list.getOrNull(position) ?: return@setOnItemClickListener
judgeDeviceConfig { onItemClick(item) }
} }
adapter = dishAdapter 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.CookingModeActivity
import com.shuwei.dish.match.ui.PrepareFoodActivity import com.shuwei.dish.match.ui.PrepareFoodActivity
import com.shuwei.dish.match.ui.SubmitFoodActivity 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.startActivity
import com.shuwei.dish.match.utils.ext.toast import com.shuwei.dish.match.utils.ext.toast
import com.yanzhenjie.recyclerview.SwipeMenuItem import com.yanzhenjie.recyclerview.SwipeMenuItem
@@ -140,15 +141,11 @@ class DishListFragment : BaseFragment<FragmentDishListBinding>() {
return SwipeMenuItem(context).apply { return SwipeMenuItem(context).apply {
setImage(R.drawable.ic_trash_white) setImage(R.drawable.ic_trash_white)
setBackground(R.drawable.bg_swipe_delete) setBackground(R.drawable.bg_swipe_delete)
width = dp2px(context, 160) width = 160.dp
height = ViewGroup.LayoutParams.MATCH_PARENT height = ViewGroup.LayoutParams.MATCH_PARENT
} }
} }
private fun dp2px(context: Context, dp: Int): Int {
return (dp * context.resources.displayMetrics.density + 0.5f).toInt()
}
/** /**
* 用 combine 同时监听网络结果与本地数据,网络成功时统一合并渲染 * 用 combine 同时监听网络结果与本地数据,网络成功时统一合并渲染
* pageNo > 1(加载更多)时 cookFoodListState 不参与合并,直接追加网络数据 * pageNo > 1(加载更多)时 cookFoodListState 不参与合并,直接追加网络数据