Как установить фоновое изображение с помощью react native и react navigation v5?

#javascript #reactjs #react-native #react-navigation #react-navigation-v5

#javascript #reactjs #react-native #react-навигация #react-navigation-v5

Вопрос:

Я использую React Native с React Navigation v5, и все, что я хочу сделать, это добавить статическое фоновое изображение в мое приложение, которое не перезагружается при каждом новом экране. Я пробовал разные подходы с настройкой стиля, например

 cardStyle: { backgroundColor: 'transparent' }
  

но я не могу найти решение. Я пытался найти решения в Интернете, но поскольку V5 довольно новый, похоже, об этом не так много разговоров.

На данный момент это мой код, но все, что он делает, это добавляет изображение поверх стека, из-за чего все кнопки, которые я добавляю в Home, исчезают.

 const Stack = new createStackNavigator();

const App = () => {
  return (
    <ImageBackground
      style={styles.center}
      source={require('./img/pic.jpg')}
      resizeMode="stretch">
      <NavigationContainer>
        <Stack.Navigator
          screenOptions={{
            cardStyle: {backgroundColor: 'transparent'},
            headerShown: false,
          }}>
          <Stack.Screen name="Home" component={Home} />
          <Stack.Screen name="Screen1" component={Screen1} />
          <Stack.Screen name="Screen2" component={Screen2} />
          <Stack.Screen name="Screen3" component={Screen3} />
        </Stack.Navigator>
      </NavigationContainer>
    </ImageBackground>
  );
};

export default App;
  

и мой styles.js при необходимости:

 import {StyleSheet} from 'react-native';

const styles = StyleSheet.create({
  center: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  }
});
export default styles;

  

Если бы кто-нибудь мог мне в этом помочь, я был бы очень признателен.

Ответ №1:

Для тех, кто использует react navigation v6, ответ заключается в использовании тем. На самом деле не знаю, есть ли они там и будут ли они работать так же в версии 5. Используя тот же предоставленный код, при импорте NavigationContainer также импортируйте с помощью DefaultTheme

 import { NavigationContainer, DefaultTheme } from '@react-navigation/native';
  

Затем создайте тему, установив цвет фона на прозрачный следующим образом

 const MyTheme = {
    ...DefaultTheme,
    colors: {
        ...DefaultTheme.colors,
        background: 'transparent',
    },
};
  

Теперь добавьте созданную тему при использовании NavigationContainer

 {/* All that code including the BackgroundImage */}
<NavigationContainer theme={MyTheme}>
    {/* Your Stack navigator and it's Screens */}
</NavigationContainer>
  

Весь экран будет выглядеть примерно так

 // All other imports
import { NavigationContainer, DefaultTheme } from '@react-navigation/native';

const Stack = new createStackNavigator();

const App = () => {

    const MyTheme = {
        ...DefaultTheme,
        colors: {
            ...DefaultTheme.colors,
            background: 'transparent',
        },
    };

    return (
        <ImageBackground
            style={styles.center}
            source={require('./img/pic.jpg')}
            resizeMode="stretch">
            <NavigationContainer theme={MyTheme}>
                <Stack.Navigator screenOptions={{ headerShown: false }}>
                    <Stack.Screen name="Home" component={Home} />
                    <Stack.Screen name="Screen1" component={Screen1} />
                    <Stack.Screen name="Screen2" component={Screen2} />
                    <Stack.Screen name="Screen3" component={Screen3} />
                </Stack.Navigator>
            </NavigationContainer>
        </ImageBackground>
    );
};

export default App;
  

Ответ №2:

Вы можете добавить ImageBackground на каждый экран, который хотите, однако удалить эффект анимации перезагрузки, который вы могли бы установить fadeDuration={0} в ImageBackground компоненте.