从其他页面返回Composable时,如何重新触发focusRequester.requestFocus()?
解决从外部页面返回后BasicTextField不自动弹出键盘的问题
原代码中LaunchedEffect(Unit)仅在Composable首次初始化时执行一次。当你从浏览器返回当前页面时,该Composable并未被销毁重建,因此这个副作用不会再次触发,导致focusRequester.requestFocus()不执行,键盘也就不会自动弹出。
方案一:监听页面生命周期,在恢复时请求焦点
利用repeatOnLifecycle监听页面的RESUMED状态,每次页面从后台回到前台(比如从浏览器返回)时,都会触发焦点请求和键盘弹出逻辑:
@Composable fun MyBasicTextField() { val keyboardController = LocalSoftwareKeyboardController.current val focusRequester = remember { FocusRequester() } val lifecycleOwner = LocalLifecycleOwner.current BasicTextField( modifier = Modifier.focusRequester(focusRequester), keyboardActions = KeyboardActions(onAny = { keyboardController?.hide() }), // 补充BasicTextField必需的value和onValueChange参数 value = "", onValueChange = {} ) LaunchedEffect(lifecycleOwner) { lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) { focusRequester.requestFocus() // 手动调用show确保键盘弹出(部分场景下请求焦点后键盘不会自动弹出) keyboardController?.show() } } }
方案二:结合导航组件监听当前页面状态(使用Jetpack Navigation时)
如果你的页面是通过Jetpack Navigation管理的,可以监听当前返回栈条目,判断页面是否处于活跃状态,再触发焦点请求:
@Composable fun MyBasicTextField(navController: NavController) { val keyboardController = LocalSoftwareKeyboardController.current val focusRequester = remember { FocusRequester() } val currentBackStackEntry by navController.currentBackStackEntryAsState() // 替换为你的页面路由 val isCurrentScreen = currentBackStackEntry?.destination?.route == "text_field_screen" BasicTextField( modifier = Modifier.focusRequester(focusRequester), keyboardActions = KeyboardActions(onAny = { keyboardController?.hide() }), value = "", onValueChange = {} ) LaunchedEffect(isCurrentScreen) { if (isCurrentScreen) { focusRequester.requestFocus() keyboardController?.show() } } }
内容的提问来源于stack exchange,提问作者Edna Krabappel
相关产品推荐
相关产品推荐

