Не удается сфокусировать ввод текста при переходе к экрану

#reactjs #react-native #react-hooks #react-navigation #react-native-paper

Вопрос:

У меня есть текстовый ввод react-native, который я хочу автоматически фокусировать при переходе к экрану (используя навигацию react-native). Я попытался настроить autoFocus={true} ввод текста, но это не сработало.

В другой попытке я попытался сфокусировать его вручную, прослушав событие «фокус» на экране, но оно сфокусировало его только при первом открытии экрана. Есть ли какой-нибудь способ заставить его работать надежно?

 export default function NewAccountScreen({ navigation }) {
  const [name, setName] = useState('');

  const textInputRef = createRef();

  // This isn't working, neither is autoFocus...
  const focusOnInput = () => {
    textInputRef.current?.focus();
  }

  navigation.addListener("focus", focusOnInput);

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

Ответ №1:

используйте React.useRef() вместо createRef();
используйте React.useEffect для прослушивания, когда ref определено, что его можно использовать.

 export default function NewAccountScreen({ navigation }) {
  const [name, setName] = useState('');

  const textInputRef = React.useRef();

  React.useEffect(() => {
     if(textInputRef.current){
        const unsubscribe = navigation.addListener('focus', () => {
          textInputRef.current?.focus()
        });
       return unsubscribe;
     }
  }, [navigation, textInputRef.current]);

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

Обновление: как комментарий @pta2002

Я попробовал это, и сейчас он иногда фокусируется, но иногда кажется, что он фокусируется, а затем сразу же расфокусируется…

я тестирую закуску, и, как он сказал, она уже несколько раз не работает!
Действительно, я не могу понять, почему?, но я кое-что пробую, и это работа.

слушайте, чтобы transitionEnd не focus

попробуйте перекусить здесь

   React.useEffect(() => {
    if (textInputRef.current) {
      const unsubscribe = navigation.addListener('transitionEnd', () => {
        textInputRef.current?.focus();
      })

      return unsubscribe;
    }
  }, [navigation, textInputRef.current])
 

другое решение работает для меня, окружая textInputRef.current?.focus(); setTimeout с 1000 мс

   React.useEffect(() => {
    if (textInputRef.current) {
      const unsubscribe = navigation.addListener('focus', () => {
        setTimeout(() => {
           textInputRef.current?.focus();
        }, 1000);
      })

      return unsubscribe;
    }
  }, [navigation, textInputRef.current])
 

Комментарии:

1. Я попробовал это, и сейчас он иногда фокусируется, но иногда кажется, что он фокусируется, а затем сразу же расфокусируется…

2. если вы можете добавить больше кода или создать проблемы с проблемой, пожалуйста, сделайте это.

3. Хм, я переписал код здесь: snack.expo.dev/@pta2002/0745da и теперь это работает… Думаю, я просто воспользуюсь этим

4. Честно говоря, я понятия не имею, почему это не работает, я скопировал этот код в свое приложение, и он все еще не работает. Я думаю, это должно быть что-то в другом месте

5. Обновление: Я снова попробовал ту же выставку, и на этот раз она не сработала, так что, думаю, здесь все еще что-то не так. Похоже, что это то, что происходит только в версии для Android.