Мне наконец-то удалось это решить.
Вот как:
- В начале моего приложения, когда я даю идентификатор для моего основного стека
const sideMenu = {
left: { /*...*/ },
center: {
stack: {
id: 'main', // this line is important
children: [/*...*/]
}
},
};
Navigation.setRoot({
root: { sideMenu },
});
- Когда я хочу запустить мастер, я добавляю новый стек
Navigation.push(componentId, {
stack: {
id: 'wizard',
children: [
{
component: { /*...*/ },
},
],
}
})
Я нажимаю на экраны в новом стеке wizard
по мере продвижения пользователя
Когда я хочу отобразить окончательный итоговый экран, я вызываю setStackRoot для вложенного стека
Navigation.setStackRoot('wizard', [
{
component: { /*...*/ },
},
]);
- На этом итоговом экране у меня есть кнопка с надписью «Готово», которая удаляет вложенный стек
Navigation.pop('main');
РЕДАКТИРОВАТЬ: только с этим подходом, если вы нажмете на стрелку назад, когда вы находитесь на вложенном экране, он будет отклонять весь вложенный стек вместо только этого экрана.
Мне пришлось использовать пользовательскую кнопку возврата следующим образом:
Я решил это с помощью пользовательской кнопки возврата:
1. При нажатии на новый экран, где я хочу переопределить кнопку, используйте параметры
import Icon from 'react-native-vector-icons/MaterialIcons';
/* ... */
const backIcon = await Icon.getImageSource('arrow-back', 24, '#000');
const component = {
id: screenID,
name: screenID,
passProps,
options: {
topBar: {
leftButtons: [
{
id: 'backButton',
icon: backIcon,
},
],
},
}
};
return Navigation.push(componentId, { component });
- Создание HOC для реализации вашего собственного обратного действия
import React, { Component } from 'react';
import { Navigation } from 'react-native-navigation';
const getDisplayName = WrappedComponent => WrappedComponent.displayName || WrappedComponent.name || 'Component';
export default function withCustomBackButton(WrappedComponent) {
class WithCustomBackButton extends Component {
componentDidMount() {
this.navigationEventListener = Navigation.events().bindComponent(this);
}
componentWillUnmount() {
if (this.navigationEventListener) this.navigationEventListener.remove();
}
navigationButtonPressed() {
// Your custom action
const { componentId } = this.props;
Navigation.pop(componentId);
}
render() {
return <WrappedComponent {...this.props} />;
}
}
WithCustomBackButton.displayName = `WithCustomBackButton(${getDisplayName(WrappedComponent)})`;
return WithCustomBackButton;
}
- При регистрации экрана с помощью пользовательской кнопки возврата, оберните его в HOC
import withCustomBackButton from '../components/hoc/WithCustomBackButton';
/* ... */
Navigation.registerComponent('selectLocation', () => withCustomBackButton(SelectLocation));