Ну, я потратил часы на решение этой проблемы.
Вот полностью работающее и протестированное решение:
- Настройте контейнер приложения, включив стек вкладок и открываясьстек модальной навигации:
const FinalTabsStack = createStackNavigator(
{
tabs: TabNavigator,
screen1: Screen1Navigator,
}, {
mode: 'modal',
}
)
Создание контейнера приложения с этим стеком вкладок для этой направляющей
Внутри TabNavigator
в createBottomTabNavigator
возвращаемом нулевом компоненте для конкретной вкладки(screen3) (для отключения навигации по реагирующему навигатору) и обработайте вкладку вручную внутри defaultNavigationOptions
, создав для нее пользовательский компонент.
const TabNavigator = createBottomTabNavigator({
screen1: Screen1Navigator,
screen2: Screen2Navigator,
screen3: () => null,
screen4: Screen4Navigator,
screen5: Screen5Navigator,
}
defaultNavigationOptions: ({ navigation }) => ({
mode: 'modal',
header: null,
tabBarIcon: ({ focused }) => {
const { routeName } = navigation.state;
if (routeName === 'screen3') {
return <Screen3Tab isFocused={focused} />;
}
},
}),
Обрабатывать щелчок вручную внутри пользовательского компонента вкладки
Screen3Tab
с помощью TouchableWithoutFeedback & onPress.Внутренний компонент Screen3Tab:
<TouchableWithoutFeedback onPress={this.onPress}>
<Your custom tab component here />
</TouchableWithoutFeedback>
После того, как вы перехватили событие редукции отправки onPress
onPress = () => {
this.props.dispatch({ type: 'NAVIGATION_NAVIGATE', payload: {
key: 'screen3',
routeName: 'screen3',
}})
}
Обработка отправленного события с использованием
Служба навигации .Я использую
redux-saga
для этого
NavigationService.navigate(action.payload);
Немного сложно, но работает.