Хотя возможно, что это связано с несоответствием пути к классам между временем компиляции и временем выполнения, это не обязательно верно.
Важно сохранить два или три разных исключения прямо в нашей голове в этот случай:
java.lang.ClassNotFoundException
Это исключение указывает, что класс не найден в пути к классам. Это указывает на то, что мы пытались загрузить определение класса, и класс не существовал в пути к классам. java.lang.NoClassDefFoundError
Это исключение указывает, что JVM посмотрел в своей внутренней структуре данных определения класса для определения класс и не нашел его. Это отличается от того, что он не может быть загружен из пути к классам. Обычно это указывает на то, что мы ранее пытались загрузить класс из пути к классам, но по какой-то причине он потерпел неудачу - теперь мы снова пытаемся использовать этот класс (и, следовательно, необходимо загрузить его, поскольку он провалился в последний раз) я даже не попытаюсь загрузить его, потому что мы не выполнили его загрузку ранее (и разумно подозреваем, что мы снова потерпим неудачу). Ранним отказом может быть исключение ClassNotFoundException или ExceptionInInitializerError (указывающее на отказ в статическом блоке инициализации) или любое количество других проблем. Дело в том, что NoClassDefFoundError не обязательно является проблемой класса. Это не рамки, это ты.
Вам не нужно использовать 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,
});
Ошибка
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
, которые переключают состояние ящика с открытого на закрытое и наоборот. Надеюсь, это поможет!