React Native: undefined не является функцией (оценка ‘(0, _reactNavigation.StackNavigator)’)
React Native меняется так часто, и некоторые части, которые мы считаем само собой разумеющимися, внезапно меняются. Итак, если у вас есть старая версия react-navigation (пакет React Native для реализации маршрутов в вашем приложении) и вы обновите ее до версии 3, вы увидите, что ваше приложение теперь дает сбой с самого начала.
Но сначала немного предыстории
Я реализовал базовый экран навигации с тремя разными вкладками, расположенными внизу экрана. В более старой версии реакции-навигации класс StackNavigator должен быть расширен некоторыми атрибутами и параметрами, указанными для его запуска, хотя некоторые значения по умолчанию облегчили мне жизнь.
Когда я обновил пакет response-navigation на своем компьютере и попытался запустить его снова, я обнаружил, что установлена новая версия 3, и мое приложение, реализованное в более старой версии 2, начало давать сбой. Это красный экран, который мне действительно показался.
Мне удалось отследить ошибку в моем RootStackNavigator, определенном как
const RootStackNavigator = StackNavigator( { Main: { screen: TabNavigator, }, } ); export default class RootNavigator extends React.Component { render() { return <RootStackNavigator/>; } }
Упомянутый там TabNavigator - это не что иное, как простое постоянное значение с такими параметрами, как tabBarPosition: 'bottom' (снизу или сверху, чтобы различать вкладку вверху или внизу экран)
const TabNavigator = StackNavigator( { ... Home: { screen: Home, navigationOptions: { tabBarLabel: 'Home', } }, }, { ... tabBarPosition: 'bottom', initialRouteName: 'Home', } );
После трассировки в файле package.json я обнаружил, что здесь была настроена response-navigation 3.6.1:
Вот что мне известно
- Класс StackNavigator и метод createTabNavigator устарели, начиная с версии v3.
- Вместо этого следует использовать метод createBottomNavigator с фактическими компонентами в виде меню.
- Эти методы минимизируют код и имеют те же параметры настройки визуального эффекта в атрибуте tabBarOptions.
- После создания навигатор должен быть обернут в appContainer с помощью метода, называемого createAppContainer.
- На самом деле нет способа реализовать верхний навигатор вкладок для iOS, но для Android он есть (createMaterialTopTabNavigator).
Итак, вот мое решение
Я удалил свой TabNavigator.js. В моем RootNavigation.js изменилось на
import React from 'react'; import Home from '../screens/Home.js'; import { createMaterialTopTabNavigator, createAppContainer } from 'react-navigation'; const RootNavigator = createMaterialTopTabNavigator({ ... Home: Home }); export default createAppContainer(RootNavigator);
В моем App.js я только что вызвал этот недавно созданный контейнер навигатора.
import React from 'react'; import RootNavigator from './navigation/RootNavigator.js' export default class App extends React.Component { render() { return ( <RootNavigator/> ); } }
Итак, сегодня я узнал…
- … Что React Native немного изменился, добавив новый способ создания верхней и нижней вкладок. Класс StackNavigator устарел, и есть новые способы создания верхней и нижней навигаторов вкладок с помощью методов createTopTabNavigator и createBottomNavigator.
- Также я научился не прикасаться к клавиатуре при обновлении пакетов реагирования, иначе я обнаружу, что просматриваю обновленную документацию, которую считал само собой разумеющейся, она никогда не изменится (~ _ ~ メ)
Чтобы узнать больше
Пожалуйста, прочтите документацию для react-navigator, она очень часто меняется с небольшими обновлениями и новыми приемами, которые могут помочь вам улучшить / поддерживать ваши приложения.
Мне показалось очень интересным, что существует метод создания вкладок навигации с таким же внешним видом, что и в Material Design. Вот ссылка.