#react-native #react-native-ios
#react-native #react-native-ios
Вопрос:
У меня есть приложение React Native, которое в основном выполняет следующие действия при запуске:
- Скрывает экран-заставку (используя react-native-bootsplash)
- Отображает начальный экран, который извлекает данные из API и отображает компоненты карты в виде плоского списка
- Основываясь на местоположении пользователя, немедленно открывает модальный (с использованием 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 к сожалению, я не нашел окончательного решения. Я все еще использую обходной путь с таймаутом..