Параметры экрана с вложенными навигаторами¶
В этом документе мы объясним, как работают опции экрана при наличии нескольких навигаторов. Важно понимать это, чтобы правильно разместить свои options
и правильно сконфигурировать навигаторы. Если вы поместите их в неправильное место, то в лучшем случае ничего не произойдет, а в худшем - случится что-то непонятное и неожиданное.
Вы можете изменять навигационные опции навигатора только из одного из его экранных компонентов. Это в равной степени относится и к вложенным экранам-навигаторам.
Возьмем, к примеру, навигатор вкладок, который содержит собственный стек на каждой вкладке. Что произойдет, если мы установим options
на экране внутри стека?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
Как мы уже говорили, изменить параметры навигации для навигатора можно только из одного из его экранных компонентов. Приведенные выше A
и B
являются экранными компонентами в HomeStack
и SettingsStack
соответственно, а не в навигаторе вкладок. Поэтому в результате свойство tabBarLabel
не будет применено к навигатору вкладок. Однако мы можем это исправить!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Когда мы задаем options
непосредственно для компонентов Screen
, содержащих компоненты HomeStack
и SettingsStack
, это позволяет нам управлять опциями родительского навигатора, когда он используется в качестве компонента экрана. В данном случае опции наших компонентов стека определяют метку в навигаторе вкладок, на котором отображаются стеки.
Установка опций родительского экрана на основе состояния дочернего навигатора¶
Представьте себе следующую конфигурацию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
Если бы мы задали headerTitle
с options
для FeedScreen
, то это бы не сработало. Это связано с тем, что стек App
при конфигурировании будет обращаться только к своим ближайшим дочерним элементам: HomeTabs
и SettingsScreen
.
Но мы можем определить опцию headerTitle
на основе состояния навигации нашего навигатора вкладок с помощью помощника getFocusedRouteNameFromRoute
. Сначала создадим функцию для получения заголовка:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Затем мы можем использовать эту функцию с параметром options
на Screen
:
1 2 3 4 5 6 7 |
|
Что же здесь происходит? С помощью хелпера getFocusedRouteNameFromRoute
мы можем получить название активного маршрута из дочернего навигатора (в данном случае это навигатор табов, так как именно его мы отображаем) и задать соответствующее название для заголовка.
Этот подход можно использовать в любом случае, когда необходимо задать параметры родительского навигатора, основываясь на состоянии дочернего навигатора. Часто встречаются следующие случаи:
- Показать заголовок вкладки в заголовке стека: стек содержит навигатор табов, и вы хотите установить заголовок в заголовке стека (пример выше).
- Показывать экраны без панели вкладок: навигатор вкладок содержит стек, и вы хотите скрыть панель вкладок на определенных экранах (не рекомендуется, вместо этого смотрите Скрытие панели вкладок на определенных экранах)
- Блокировка drawer на определенных экранах: в drawer находится стек, и вы хотите заблокировать drawer на определенных экранах.
Во многих случаях аналогичного поведения можно добиться, реорганизовав навигаторы. Обычно мы рекомендуем использовать этот вариант, если он подходит для конкретного случая.
Например, в приведенном выше случае вместо того, чтобы добавлять навигатор вкладок внутри навигатора стопки, можно добавить навигатор стопки внутри каждой из вкладок.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
|
Кроме того, это позволяет добавлять новые экраны в стеки лент и профилей, не скрывая панель вкладок, путем добавления дополнительных маршрутов в эти стеки.
Если вы хотите разместить экраны поверх панели табов (т.е. не показывающие панель табов), то их можно добавить в стек App
вместо того, чтобы добавлять их в экраны внутри навигатора по табам.