2017-10-02 1 views
0

Ich benutze die React-Native-Restart-Bibliothek für den Neustart der App, damit ich die App-Sprache in der Laufzeit ändern kann. Nachdem ich die App neu gestartet habe, möchte ich nach dem Neustart der App den ersten StackNavigator-Bildschirm in der react-navigation-Bibliothek ändern.Reactive Native Navigation bei Neustart

Navigator-Klasse ist wie folgt

import Screen1 from './Screen1' 
import Screen2 from './Screen2' 
import Screen3 from './Screen3' 
import {StackNavigator} from 'react-navigation'; 

const Navigator = StackNavigator({ 
    Screen1: { 
     screen: Screen1 
    }, 
    Screen2: { 
     screen: Screen2 
    }, 
    Screen3: { 
     screen: Screen3 
    } 
}); 

export default Navigator; 

in Bildschirm 2 ich die Sprache ändern und starten Sie die App durch die folgende Funktion:

_onDirectionChange =() => { 
     I18nManager.forceRTL(true); 
     // Immediately reload the React Native Bundle 
     RNRestart.Restart(); } 
+1

Sie eine Frage hinzufügen vergessen ... fragen Sie, wie Sie die App neu zu starten und den Benutzer zurück, was auch immer Bildschirm sie die Sprache geändert von? –

+0

@ChrisGeiman Frage im Text "Ich möchte den ersten StackNavigator-Bildschirm in der Reaktivnavigationsbibliothek nach dem Neustart der App ändern." – amorenew

Antwort

0

jedoch fandro Antwort ist eine gute Antwort, aber es gibt eine einfache Antwort auf den folgenden Link: Change StackNavigator order #2683

Es gibt eine Option für den Router genannt initialRouteName:

const Navigator = StackNavigator({ 
    Screen1: { 
     screen: Screen1 
    }, 
    Screen2: { 
     screen: Screen2 
    }, 
    Screen3: { 
     screen: Screen3 
    } 
},{ 
    initialRouteName: RTL ? 'Screen2' : 'Screen1', 
}); 

-Update: Volle Lösung:

const Navigator = StackNavigator({ 
    InitialScreen: { 
     screen: InitialScreen 
    }, 
    Splash: { 
     screen: Splash 
    }, 
    LanguageStartup: { 
     screen: LanguageStartup 
    }, 
    Login: { 
     screen: Login 
    }, 
    Register: { 
     screen: Register 
    } 
}, {initialRouteName: 'InitialScreen'}); 

export default Navigator; 

Mein Einstieg

import React, {Component} from 'react'; 
import {connect} from 'react-redux'; 
import * as GeneralPref from './../preferences/GeneralPref' 
import Log from './../utils/Log' 
import {AsyncStorage, View} from 'react-native'; 
import * as Pref from './../preferences/Preferences'; 
import {NavigationActions} from 'react-navigation' 

const TAG = 'InitialScreen' 

class InitialScreen extends Component { 
    static navigationOptions = { 
     header: false 
     }; 
    componentWillMount() { 
     Log(TAG+' Mount') 
     const {navigate} = this.props.navigation; 
     GeneralPref 
      .getInitialScreen() 
      .then(value => { 
       Log(TAG+' Initial',value)     
       if (value != null) { 
        Log(TAG+' Initial',value)          
        return value 
       } else { 
        Log(TAG+' No Initial','Splash')          
        return 'Splash' 
       } 
      }) 
      .then(screenName => this.props.navigation.dispatch(NavigationActions.reset({ 
       index: 0, 
       actions: [NavigationActions.navigate({routeName: screenName})] 
      }))) 
      .catch(err => { 
       Log(TAG+' Initial Error',value)         
       this.props.navigation.dispatch(NavigationActions.reset({ 
        index: 0, 
        actions: [NavigationActions.navigate({routeName: 'Splash'})] 
       })) 
      }); 
    } 
    render() { 
     return null; 
    } 
} 

export default InitialScreen; 

dann in Bildschirm Sprache

changeLanguageTo(language) { 
    Log(TAG+'Change Language', "Change Language To: " + language.code); 
    // Log(TAG, 'Current State'); 
    Log(TAG+' Language State', language); 
    GeneralPref.setInitialScreen('Login'); 

    this 
     .props 
     .actions 
     .changeLanguage(language); 
     I18nManager.forceRTL(true);  
    // Immediately reload the React Native Bundle 
    RNRestart.Restart(); 
    }; 
2

Vielleicht können Sie eine Paramater in den mobilen Einstellungen speichern und eine Bedingung basierend darauf erstellen, um den richtigen Navigator beim Laden zu laden:

Der Code wird etwa lauten:

const Navigator = IsRestarting() ? MyNewNavigator({}) : StackNavigator({}); 

Hierbei kann IsRestarting() eine Funktion sein, die einen Wertspeicher im Mobiltelefon überprüft, nachdem Sie die Anwendung zum Neustart aufgefordert haben. Wenn der Wert beispielsweise tru ist, geben Sie einen benutzerdefinierten Navigator zurück, andernfalls geben Sie den Standardwert zurück.

Ich hoffe, es hilft.

+0

das ist eine gute Lösung aber Dosis StackNavigator haben irgendein Bestellsystem? – amorenew

+1

Ich weiß es nicht, Sie müssen versuchen oder überprüfen Sie die Dokumentation – fandro

Verwandte Themen