Выбор ответа Middle Анимации и жесты обновлено
Reanimated: вызов JS из worklet
Вопрос
В обработчике окончания жеста (worklet) нужно вызвать setDismissed(true) и навигацию. Как правильно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Через runOnJS(fn)(args), который планирует вызов на JS-потоке. Worklet выполняется в другом рантайме, и функции из JS-потока там не существуют как вызываемые. runOnJS планирует вызов на JS-потоке.
Варианты ответа
- Через
runOnJS(fn)(args), который планирует вызов на JS-потокеправильный ответ - Вызвать напрямую: у worklet есть доступ ко всему JS-коду приложения
- Через
setTimeoutвнутри worklet, он перенесёт вызов на JS-поток - Никак: это невозможно, придётся отказаться от Reanimated для этого жеста
Разбор
Worklet выполняется в другом рантайме, и функции из JS-потока там не существуют как вызываемые. runOnJS планирует вызов на JS-потоке. Прямой вызов приведёт к ошибке, setTimeout не решает проблему разных рантаймов. В Reanimated 4 аналогичную роль играют функции планирования из react-native-worklets.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.