Отображение модального режима React Native сразу после запуска приложения замораживает экран в iOS

#react-native #react-native-ios

#react-native #react-native-ios

Вопрос:

У меня есть приложение React Native, которое в основном выполняет следующие действия при запуске:

  1. Скрывает экран-заставку (используя react-native-bootsplash)
  2. Отображает начальный экран, который извлекает данные из API и отображает компоненты карты в виде плоского списка
  3. Основываясь на местоположении пользователя, немедленно открывает модальный (с использованием react-native-modal) с предложением

Этот поток происходит через ~ 3 секунды.

На Android он работает так, как ожидалось. Хотя в iOS я сталкиваюсь со следующей проблемой:

После открытия приложения отображаемый домашний экран зависает, а модальный не отображается. Этот экран является дочерним элементом DrawerNavigator, который продолжает работать. Таким образом, я могу открывать и закрывать меню ящика из заголовка, но начальный экран полностью заморожен.

Тесты, которые я выполнил до сих пор:

  • Удаление модального компонента: экран не зависает.
  • Перейдите на другой экран (через меню ящика) и вернитесь на главный экран: работает нормально (отображает список, открывает модальный и т.д.), т. Е. зависания нет.
  • Перезагрузите приложение из меню отладки RN (встряхните или Cmd Control Z): работает нормально (отображает список, открывает модальный и т. Д.), Т. Е. зависания нет.

Важно отметить, что приложение получает местоположение пользователя перед открытием модального режима. Таким образом, проблема, похоже, не связана с логикой местоположения. В тестовом примере, в котором я удалил модальный, логика расположения осталась прежней, и экран не зависал.

Учитывая описанное поведение, мне кажется, что это какой-то конфликт между раскадровкой / представлением, который отображает заставку, и модальным компонентом, поскольку это происходит, когда я открываю приложение, и не происходит, когда я перезагружаю его из меню RN.

Поэтому я протестировал ожидание в течение 2 секунд, прежде чем изменять состояние, которое открывает модальное, следующим образом:

 setTimeout(() => setModalOpen(true), 2000);
 

и это работает! Хотя, если я уменьшу время ожидания до 1 секунды, оно все равно зависнет. Из того, что я тестировал, пороговое значение составляет от 1,3 до 1,5 секунд, что означает, что все, что ниже, вызывает замораживание, и все, что выше, работает нормально.

Я тестировал как в эмуляторе (iPhone 11 — iOS 13.5), так и на устройстве (iPhone XR — iOS 14.2).

Кто-нибудь знает, что именно может быть причиной такого поведения и как его можно избежать, не используя тайм-ауты в качестве обходного пути?

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

1. У меня сейчас такая же проблема, я хотел бы знать, нашли ли вы решение с момента публикации вопроса

2. @prog к сожалению, я не нашел окончательного решения. Я все еще использую обходной путь с таймаутом..