#react-native #react-navigation
#react-native #react-навигация
Вопрос:
Я создаю приложение, в котором пользователям предлагается выбрать свой язык при первом запуске приложения. Затем язык сохраняется локально с использованием AsyncStorage.
При каждом запуске приложения язык извлекается из хранилища и сохраняется в global.lang
переменной, которая будет использоваться всеми компонентами:
AsyncStorage.getItem('settings', (err, item) => {
global.lang = item.lang;
});
Когда я использую global.lang
переменную в render()
методе в любом компоненте, кажется, что все в порядке. Однако я сталкиваюсь с проблемами при попытке использовать ту же переменную при инициализации моих навигаторов:
const TabNavigator = createBottomTabNavigator(
{
Home: {
screen: HomeScreenNavigator,
navigationOptions:{
title: strings['en'].linkHome, --> this works
}
},
News: {
screen: NewsScreen,
navigationOptions:{
title: strings[global.lang].linkNews, --> this fails
}
}
});
Я полагаю, что это потому, что значение не извлекается из AsyncStorage к моменту создания навигаторов. Если я устанавливаю global.lang
вручную (например, global.lang = 'en';
), кажется, что все в порядке, но не тогда, когда я пытаюсь извлечь его из хранилища.
Есть ли что-то, чего мне не хватает? Могу ли я инициализировать навигатор языком по умолчанию и изменить название позже на основе восстановленного значения?
Любая помощь была бы высоко оценена.
Комментарии:
1. Почему бы не подождать, пока AsyncStorage не получит значение, и после этого не создать навигатор?
2. похоже, что создание навигатора не ожидает выполнения другого кода
Ответ №1:
Навигаторы создаются при запуске приложения. Итак, вам нужно будет использовать некоторый текст-заполнитель и использовать метод, описанный здесь, где вы меняете все заголовки экрана на основе клавиши screen…
Или … это звучит безумно, и я никогда не пробовал это. Но вы можете использовать экран загрузки, где вы получаете настройки languaje. затем… с помощью условного отображения вы «визуализируете» компонент navigator . Я бы хотел, чтобы это работало так же, но вы можете попробовать. ниже приведен некоторый код, который я только что создал для этой цели
export default class MainComponent extends React.Component {
constructor(props) {
super(props);
this.state = { hasLanguage:false};}
componentDidMount(){
this.retrieveLanguage()
}
async retrieveLanguage(){
//await AsyncStorage bla bla bla
//then
this.setState({hasLanguage:true})
}
render() {
return (
{
this.state.hasLanguage?
<View>
//this is a view that is rendered as a loading screen
</View>:
<Navigator/>//this will be rendered, and hence, created, when there is a language retrieved
}
);
}
}
Снова. Я не знаю, создает ли react navigation навигатор при рендеринге. Если да. При создании навигатора должен быть язык, который там будет использоваться
Комментарии:
1. Спасибо за ваш ответ. Я решил свою проблему, следуя вашим первым предложениям, в которых я отображаю навигаторы с помощью текста-заполнителя и заменяю его во время выполнения.