Nano Hash - криптовалюты, майнинг, программирование

Невозможно перейти от DrawerLayoutAndroid к любому другому экрану в родной реакции (Android)

У меня есть следующий код

Боковая панель.js

import React from 'react'
import {View,Text,StyleSheet,Image,TouchableHighlight} from 'react-native';
import {Dimensions} from 'react-native';
import  Feather  from 'react-native-vector-icons/Feather';

// const WIDTH = Dimensions.get('window').width;
const HEIGHT = Dimensions.get('window').height;

const logo = require('../assets/logo1.png');


export default class Sidebar extends React.Component {
    constructor(props){
        super(props);
        this.handleNavigation = this.handleNavigation.bind(this);// you should bind this to the method that call the props
    }
    
    handleNavigation(){
        this.props.navigation.navigate('QuoteDay');
    }
    render() {
        return (
            <View style={styles.navigationContainer}>
               <View style={styles.logoContainer}>
                    <Image  style={styles.logo}
                     source={logo} />   
               </View>
                    </TouchableHighlight>
                    <TouchableHighlight
                        activeOpacity={0.6}
                        underlayColor="#ffffff"
                        onPress={() => alert('Pressed!')}>
                        <Text style={styles.listitem}> <Feather name="edit" size={30} color="#273746"/> Quotes </Text>
                    </TouchableHighlight>
                    <TouchableHighlight
                        activeOpacity={0.6}
                        underlayColor="#ffffff"
                        onPress={this.handleNavigation}>
                        <Text style={styles.listitem}> <Feather name="sunrise" size={30} color="#273746"/> Quote of the Day </Text>
                    </TouchableHighlight>
               </View>
            </View>
        )
    }
}

App.js

import React from 'react';
import {DrawerLayoutAndroid} from 'react-native';
import {AppNavigator} from './screens/Navigation';
import Sidebar from './screens/Sidebar';

export default class App extends React.Component {

  render(){
    const navigationView = (
      <Sidebar/>
    );
    return (
        <DrawerLayoutAndroid
          drawerWidth={300}
          drawerPosition="left"
          statusBarBackgroundColor="#F0B27A"
          renderNavigationView={() => navigationView}
        >
          <AppNavigator />
       </DrawerLayoutAndroid>
    )
  }
}

Навигация.js

import React from 'react';
import 'react-native-gesture-handler';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import { HomeScreen } from './Home';
import { ModalScreen } from './Modal';
import { QuoteScreen } from './QuoteDay';

const { Navigator, Screen } = createStackNavigator();

const HomeNavigator = () => (
  <Navigator mode="modal" headerMode='none'>
    <Screen name='Home' component={HomeScreen} />
    <Screen name='MyModal' component={ModalScreen}/>
    <Screen name='QuoteDay' component={QuoteScreen}/>
  </Navigator>
);

export const AppNavigator = () => (
  <NavigationContainer>
    <HomeNavigator/>
  </NavigationContainer>
);

Но это дает мне следующую ошибку

TypeError: undefined не является объектом (оценка «this.props.navigation.navigate»)

всякий раз, когда я пытаюсь перейти с Sidebar.js на любой другой экран.

Как я мог решить эту проблему.


Ответы:


1

Проблема в том, что Sidebar не отображается внутри экрана в навигаторе и, следовательно, не получает реквизит navigation, который объясняет ошибку, которую вы получаете.

Я рекомендую вам использовать ящик для навигации по реакции (https://reactnavigation.org/docs/drawer-navigator/) вместо DrawerLayoutAndroid. Вы по-прежнему можете использовать свой пользовательский макет компонента Sidebar таким образом, передав Sidebar реквизиту drawerContent навигатора Drawer навигации.

Навигация.js

import {NavigationContainer} from '@react-navigation/native';
import {createStackNavigator} from '@react-navigation/stack';
import {createDrawerNavigator} from '@react-navigation/drawer';
import Sidebar from './path';
// Other imports...

const Home = createStackNavigator();
const Main = createDrawerNavigator();

const MainNavigator = () => {
  return (
    <Main.Navigator
      drawerStyle={{width: 240}}
      drawerContent={(props) => <Sidebar {...props} />}>
      <Main.Screen name="HomeNavigator" component={HomeNavigator} />
    </Main.Navigator>
  );
};

const HomeNavigator = () => (
  <Home.Navigator mode="modal" headerMode="none">
    <Home.Screen name="Home" component={HomeScreen} />
    <Home.Screen name="MyModal" component={ModalScreen} />
    <Home.Screen name="QuoteDay" component={QuoteScreen} />
  </Home.Navigator>
);

export const AppNavigator = () => (
  <NavigationContainer>
    <MainNavigator />
  </NavigationContainer>
);

App.js

// Be sure to import StatusBar from 'react-native' for setting the status bar color 

export default class App extends React.Component {
  componentDidMount() {
    StatusBar.setBackgroundColor('#F0B27A');
  }

  render() {
    return <AppNavigator />;
  }
}

Таким образом, подход, который я использовал здесь, заключается в создании Drawer Navigator и назначении его основным навигатором. HomeNavigator — это экран этого MainNavigator. Таким образом, каждый экран внутри MainNavigator имеет доступ к ящику и навигационной опоре; В данном случае это означает HomeNavigator и все его экраны.

09.09.2020
  • Большое спасибо, это работает очень хорошо, я узнал кое-что новое, еще раз спасибо за такое четкое предложение и решение. 09.09.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..