React-native - undefined - это не функция

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

Важно сохранить два или три разных исключения прямо в нашей голове в этот случай:

  1. java.lang.ClassNotFoundException Это исключение указывает, что класс не найден в пути к классам. Это указывает на то, что мы пытались загрузить определение класса, и класс не существовал в пути к классам.
  2. java.lang.NoClassDefFoundError Это исключение указывает, что JVM посмотрел в своей внутренней структуре данных определения класса для определения класс и не нашел его. Это отличается от того, что он не может быть загружен из пути к классам. Обычно это указывает на то, что мы ранее пытались загрузить класс из пути к классам, но по какой-то причине он потерпел неудачу - теперь мы снова пытаемся использовать этот класс (и, следовательно, необходимо загрузить его, поскольку он провалился в последний раз) я даже не попытаюсь загрузить его, потому что мы не выполнили его загрузку ранее (и разумно подозреваем, что мы снова потерпим неудачу). Ранним отказом может быть исключение ClassNotFoundException или ExceptionInInitializerError (указывающее на отказ в статическом блоке инициализации) или любое количество других проблем. Дело в том, что NoClassDefFoundError не обязательно является проблемой класса.
2
задан dentemm 16 January 2019 в 17:50
поделиться

2 ответа

Это не рамки, это ты.

Вам не нужно использовать app.js в качестве фиктивного компонента, вы можете напрямую использовать тот же код Routes.js в вашем app.js. Обертывание навигатора внутри компонента создает проблемы.

Во-вторых, вы используете appregistry дважды, вы должны использовать его один раз, он направляется прямо в App.js, у которого нет ящика, и вообще не используетоллнесс, поэтому undefined не является функцией, нет ящика.

index.js [первый файл реакции-нативный изучает]

import { AppRegistry, Dimensions } from 'react-native';
import {name as appName} from './app.json';
import { createDrawerNavigator , createAppContainer } from 'react-navigation';
import SideMenu from './src/SideMenu'
import Routes from './src/Routes';

const drawernav = createDrawerNavigator({
  Item1: {
      screen: Routes,
    }
  }, {
    contentComponent: SideMenu,
    drawerWidth: Dimensions.get('window').width - 120,  
});

AppRegistry.registerComponent(appName, () => createAppContainer(drawernav));  //createAppContainer goes in your root navigator, in this case, a drawer

rout.js

import { createStackNavigator } from 'react-navigation';
import Home from './Home';
import Settings from './Settings';
import SideMenu from './SideMenu';
import { Button, Text, TouchableOpacity } from 'react-native';

const Nav = createStackNavigator({
  Home: {
    screen: Home,
    navigationOptions: ({navigation}) => ({
      title: "Home",
      headerLeft:(<TouchableOpacity onPress={() => navigation.openDrawer()}>
                <Text >Button</Text>
              </TouchableOpacity>
   ),
  })
 },
  Settings: {
    screen: Settings,
    navigationOptions: ({navigation}) => ({
    title: "Settings",
  })     
  },
}); 

export default Nav;

Кроме того, поскольку вы просто отображая один компонент в навигаторе ящиков (Маршруты), вы не должны вкладывать экраны в стекнавигатор, просто передавайте его в секвенатор, и он автоматически переключается между ними

const drawernav = createDrawerNavigator({
  Item1: {
      screen: Home,
      screen: Settings,
    }
  }, {
    contentComponent: SideMenu,
    drawerWidth: Dimensions.get('window').width - 120,  
});
0
ответ дан ValdaXD 16 January 2019 в 17:50
поделиться

Ошибка

undefined is not a function (evaluating navigation.openDrawer()')

выбрасывается, потому что опора navigation не имеет метода openDrawer . Вместо этого вам нужно использовать метод dispatch и помощника DrawerActions:

import { DrawerActions } from 'react-navigation'
...
const Nav = createStackNavigator({
  Home: {
    screen: Home,
    navigationOptions: ({navigation}) => ({
      title: "Home",
      headerLeft:(
        <TouchableOpacity onPress={() => navigation.dispatch(DrawerActions.openDrawer())}>
          <Text>Button</Text>
        </TouchableOpacity>
      ),
    })
  },

DrawerActions имеет три метода , каждый из которых возвращает диспетчеризируемые действия. openDrawer, closeDrawer и toggleDrawer, которые переключают состояние ящика с открытого на закрытое и наоборот. Надеюсь, это поможет!

0
ответ дан Robbie Milejczak 16 January 2019 в 17:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: