You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导航到屏幕时无法聚焦react-native-paper TextInput如何可靠解决?

React Native Navigation 下 TextInput 稳定自动聚焦实现方案

问题根因

你当前的写法存在两个核心问题:

  • 每次组件重渲染都会创建新的createRef实例,并且重复注册focus事件监听器、没有做清理,会导致第二次及之后进入页面时,ref指向异常、监听器逻辑冲突
  • 屏幕focus事件触发时,输入框可能还未完成挂载渲染,直接调用focus方法无效
    同时autoFocus属性不生效是正常现象:react-native-navigation 页面切换的时机晚于组件初始化时autoFocus的触发时机,页面真正可见时autoFocus逻辑已经执行完毕,自然不会生效。

修复后代码

import { useEffect, useRef, useState } from 'react';
import { View, requestAnimationFrame } from 'react-native';
import { TextInput } from 'react-native-paper';

export default function NewAccountScreen({ navigation }) {
  const [name, setName] = useState('');
  // 用useRef保证引用在组件生命周期内稳定
  const textInputRef = useRef(null);

  useEffect(() => {
    const focusOnInput = () => {
      // 等待页面渲染完成后再执行聚焦,规避组件未挂载完成的问题
      requestAnimationFrame(() => {
        textInputRef.current?.focus();
      });
      // 低概率场景下requestAnimationFrame不生效可以替换为短延时setTimeout:
      // setTimeout(() => textInputRef.current?.focus(), 100);
    };

    // 注册focus监听器
    const unsubscribe = navigation.addListener("focus", focusOnInput);
    // 组件卸载时清理监听器,避免重复注册和内存泄漏
    return unsubscribe;
  }, [navigation]);

  return (
    <View>
      <TextInput ref={textInputRef} label="Account name" value={name} onChangeText={setName}/>
    </View>
  )
}

异常排查

如果以上方案仍然偶发不生效,可以检查两个点:

  • 确认页面没有其他弹出层、键盘控制逻辑抢占输入框焦点
  • 如果你对react-native-paper的TextInput做了二次封装,要确认ref已经正确转发到原生输入框组件,没有被中间层拦截

内容的提问来源于stack exchange,提问作者pta2002

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:24:04