Angenommen, ich habe in meiner StackNavigator-App durch 4 Bildschirme navigiert und möchte jetzt zum ersten Bildschirm zurückkehren. Es gibt scheinbar drei verschiedene Möglichkeiten, dies zu tun, und sie navigieren dorthin, wo ich hin möchte, jedoch hat jeder Weg eine Animation, die durch jeden vorherigen Bildschirm läuft.
Gibt es eine saubere Möglichkeit, von SCREEN_D
zu SCREEN_A
zu navigieren?
Mit anderen Worten, ich möchte SCREEN_C
und SCREEN_B
nicht im Bruchteil einer Sekunde sehen, bevor SCREEN_A
beim Rückwärtsfahren von SCREEN_D
angezeigt wird.
navigation.navigate(SCREEN_A);
...
navigation.navigate(SCREEN_B);
...
navigation.navigate(SCREEN_C);
...
navigation.navigate(SCREEN_D);
Drei Möglichkeiten, dies zu tun:
1.
return this.props.navigation
.dispatch(NavigationActions.reset(
{
index: 0,
actions: [NavigationActions.navigate({ routeName: 'SCREEN_A'})]
}));
2.
const {SCREEN_B_KEY} = this.props.navigation.state.params
this.props.navigation.goBack(SCREEN_B_KEY)
3.
const defaultGetStateForAction = Navigation.router.getStateForAction;
Navigation.router.getStateForAction = (action, state) =>{
if(action.type === "Navigation/BACK"){
const routes = [
{routeName: 'First'},
];
return {
...state,
routes,
index: 0,
};
}
return defaultGetStateForAction (action,state);
}
reagieren-native Navigation hat popToTop
wir können es wie Schlag verwenden
this.props.navigation.popToTop()
Hier ist eine schnelle Lösung ... Hiermit werden ALLE Übergänge beim Navigieren (vorwärts oder rückwärts) entfernt.
const Nav = StackNavigator({
Screens
},{
transitionConfig,
navigationOptions
});
in transitionConfig fügen Sie Folgendes hinzu:
const transitionConfig = () => ({
transitionSpec: {
duration: 0,
timing: Animated.timing,
easing: Easing.step0,
},
})
Die transitionConfig ist eine Funktion, die ein Objekt zurückgibt, das die Standardübergänge des Bildschirms überschreibt. https://reactnavigation.org/docs/navigators/stack
Sie können dies tun, indem Sie die popToTop
-Methode aus der Navigation prop verwenden. Wenn Sie redux verwenden, sollten Sie auch Ihre Redux-Integration aktualisieren.
Hoffe das hilft!
Ich habe auch einige Zeit damit verbracht, lassen Sie mich zusammenfassen, was ich herausgefunden habe. Dafür gibt es mehrere Lösungen/Workarounds:
CardStackStyleInterpolator
Die von Cristiano Santos erwähnte pull-Anforderung scheint zusammengeführt zu werden. So können Sie die CardStackStyleInterpolator
mit diesem Import laden:
import CardStackStyleInterpolator from 'react-navigation/src/views/CardStack/CardStackStyleInterpolator'
Um es so anzuwenden:
const YourStackNavigator = StackNavigator({
Screen1: { screen: Screen1 },
Screen2: { screen: Screen2 },
}, {
transitionConfig: () => ({
screenInterpolator: (props) => CardStackStyleInterpolator.forHorizontal(props)
})
});
In meinem Fall springe ich einfach zum nächsten Bildschirm wie:
this.props.navigation.navigate('Modal_AddGoodClass');
Aber in meinem Reducer setze ich den Navigator zurück, wenn der Modal_AddGoodClass
Bildschirm ausgelöst wird:
const NewExportReceiptNavigationReducer = (state, action) => {
// Default stuff
let newStateBuffer = newState || state;
if (action) {
if (action.type === 'Navigation/NAVIGATE') {
if (action.routeName === 'Modal_AddGoodClass') {
newStateBuffer = {
index: 0,
routes: [
newStateBuffer.routes[newStateBuffer.routes.length - 1]
]
};
}
}
}
return newStateBuffer;
};
module.exports = NewExportReceiptNavigationReducer;
Dies funktioniert ziemlich gut, mit der Ausnahme, dass immer noch eine "zurück" -Animation anstelle einer "vorwärts" -Animation verwendet wird.
Sie können here auch als Beispielcode finden, der CardStackStyleInterpolator
verwendet.
getStateForAction
:Wie Fendrian erwähnt hier können Sie getStateForAction
Ihres Routers überschreiben, um zu vermeiden, dass der Navigator zurückkehrt. Dies scheint zu funktionieren, mit Ausnahme der Geste "Zurückblättern" unter iOS:
Nav = StackNavigator(navScreens, navOptions);
const defaultGetStateForAction = Nav.router.getStateForAction;
Nav.router.getStateForAction = (action, state) => {
if (
state &&
action.type === NavigationActions.BACK &&
(
state.routes[state.index].routeName === 'Login' ||
state.routes[state.index].routeName === 'Main'
)
) {
// Returning null indicates stack end, and triggers exit
return null;
}
return defaultGetStateForAction(action, state);
};
Dies ist meine Arbeitslösung für das Zurücksetzen zu Hause (root), ohne dass eine neue Route erstellt wird
if(this.categoriesNav.state.nav.index >0){
let k = this.categoriesNav.state.nav.routes[1].key;
this.categoriesNav.dispatch(NavigationActions.back({key: k})); }
categoriesNav
verweist auf meinen Stack-Navigator