Выбор ответа Middle Анимации и жесты обновлено

Reanimated: вызов JS из worklet

Вопрос

В обработчике окончания жеста (worklet) нужно вызвать setDismissed(true) и навигацию. Как правильно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Через runOnJS(fn)(args), который планирует вызов на JS-потоке. Worklet выполняется в другом рантайме, и функции из JS-потока там не существуют как вызываемые. runOnJS планирует вызов на JS-потоке.

Варианты ответа

  1. Через runOnJS(fn)(args), который планирует вызов на JS-потокеправильный ответ
  2. Вызвать напрямую: у worklet есть доступ ко всему JS-коду приложения
  3. Через setTimeout внутри worklet, он перенесёт вызов на JS-поток
  4. Никак: это невозможно, придётся отказаться от Reanimated для этого жеста

Разбор

Worklet выполняется в другом рантайме, и функции из JS-потока там не существуют как вызываемые. runOnJS планирует вызов на JS-потоке. Прямой вызов приведёт к ошибке, setTimeout не решает проблему разных рантаймов. В Reanimated 4 аналогичную роль играют функции планирования из react-native-worklets.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.