反应本机路由器通量:TypeError:未定义不是函数(评估'addListener')

Posted

技术标签:

【中文标题】反应本机路由器通量:TypeError:未定义不是函数(评估\'addListener\')【英文标题】:React native router flux: TypeError: undefined is not a function (evaluating 'addListener')反应本机路由器通量:TypeError:未定义不是函数(评估'addListener') 【发布时间】:2018-07-18 06:43:48 【问题描述】:

我正在使用这个主要依赖项开发一个反应原生应用程序:

原生反应 反应原生路由器通量 反应重击 世博会

我正在使用这个 package.json:

"dependencies": 
    "expo": "23.0.4",
    "humps": "^2.0.0",
    "install": "^0.10.1",
    "lodash": "^4.17.4",
    "native-base": "^2.3.5",
    "react": "16.0.0",
    "react-native": "0.50.4",
    "react-native-extend-indicator": "^0.1.2",
    "react-native-keyboard-aware-scroll-view": "^0.4.2",
    "react-native-maps": "^0.19.0",
    "react-native-maps-directions": "^1.3.0",
    "react-native-modal-datetime-picker": "^4.13.0",
    "react-native-qrcode": "^0.2.6",
    "react-native-router-flux": "4.0.0-beta.24",
    "react-native-svg-uri": "^1.2.3",
    "react-native-swiper": "^1.5.13",
    "react-native-vector-icons": "^4.4.2",
    "react-navigation-redux-debouncer": "^0.0.2",
    "react-redux": "^5.0.6",
    "redux": "^3.7.2",
    "redux-logger": "^3.0.6",
    "redux-thunk": "^2.2.0",
    "swagger-client": "2.1.32"
  

应用程序正在使用 expo,所以我使用以下方式安装依赖项:

纱线安装

然后运行应用程序

yarn start --reset-cache

我工作得很好,因为我想添加一个新的依赖项,所以我删除了 node_modules 文件夹和 yarn.lock 文件,添加了新的依赖项并再次执行 yarn install。

之后,打开应用程序时出现此错误:

TypeError: undefined is not a function (evalating 'addListener')

它与 react-navigation 相关,但我使用 react-native-router-flux 4.0.0-beta.24,内部使用 react-navigation ^1.0.0-beta.19。

我最近注意到使用 react-navigation 的人在使用 beta.28 版本时遇到了一些问题 (https://github.com/react-navigation/react-navigation/issues/3416)。

如果我回到以前的 node_modules 文件夹(从垃圾箱中),我的应用程序运行良好,所以.. 可能问题是我的 package.json 的 ^ 符号的某些依赖项不是更兼容.. 可能 thunk 或用我的反应原生版本反应原生路由器通量。

有什么想法吗?

这是我使用 react thunk 中间件时的代码部分:

import applyMiddleware, compose, createStore from 'redux';
import thunkMiddleware from 'redux-thunk';
import createLogger from 'redux-logger';
import getRootReducer from "../reducers/index";
import navigationDebouncer from 'react-navigation-redux-debouncer';
import restApi from "../lib/restApi";

const loggerMiddleware = createLogger( predicate: (getState, action) => __DEV__  );

export default function getStore(initialState) 
    const enhancer = compose(
        applyMiddleware(
            thunkMiddleware.withExtraArgument(restApi),
            navigationDebouncer(600),
            loggerMiddleware
        ),
    );
    return createStore(
        getRootReducer,
        initialState,
        enhancer
    );

这是主应用程序:

import React, Component from 'react';
import Provider from 'react-redux'
import getStore from './src/store/configureStore'
import StatusBar from 'react-native'
import AppNavigation from './src/navigation';

const Store = getStore();

export default class App extends Component 

    constructor(props) 
        super(props);
    

    async componentWillMount() 
        await Expo.Font.loadAsync(
            'Ionicons': require('native-base/Fonts/Ionicons.ttf'),
        );
    

    render() 
        StatusBar.setHidden(true);
        return (
            <Provider store=Store>
                <AppNavigation/>
            </Provider>
        );
    

编辑:我发现现在 react-native-router-flux 使用 1.0.0 react-navigation(新的稳定版本),并且在使用 1.0.0-beta.27 版本之后..该应用程序适用于 beta 版本,但 1.0.0 版本存在此问题... 所以我意识到您在上一个版本(1.0.0-22.beta)中使用的是固定版本的反应导航

所以问题是,有没有办法仍然使用 RNRF 4.0.0-beta.24 但使用固定版本(例如 1.0.0-27.beta)?

我的意思是,我认为 4.0.0-beta.24 使用 ^1.0.0-beta19(这将导致安装最后一个 1.0.0 版本)和 4.0 等较新版本是没有意义的。 0-beta.28 使用固定的低版本(1.0.0-beta.22)

【问题讨论】:

【参考方案1】:

所以在做了一些研究和一些测试之后,我想回答我的问题。

问题在于 react-navigation 依赖项在内部处理 react-native-router-flux

依赖项是:

react-native-router-flux beta.0 - beta.24 -> react-navigation ^1.0.0-beta.19
react-native-router-flux beta.25 - beta.28 -> react-navigation 1.0.0-beta.22

这里最大的区别是从 0 到 beta24 的版本使用 ^

那么..有什么问题?

安装依赖时 beta24 将搜索自 1.0.0-beta.19 以来的最新版本的 react-navigation,该版本是 react-navigation 的最新稳定版本 1.0.0(该库不再处于 beta 版本)。

react-native-router-flux 不提供对该依赖项的支持。它也不提供对其他较旧的依赖项的支持,因此他们只是将 1.0.0-beta22 react-navigation 依赖项 固定在他们最新版本的 package.json 中(因为 beta 26).

可能他们会修复它,因为有很多应用程序使用 redux 或其他与 react-native-router-flux 没有良好交互的库。

所以现在..对于 Redux 用户的解决方案是去 beta26 版本,对于不使用 redux 的人来说可能 beta27 和 beta28 都可以。

这里是讨论:https://github.com/aksonov/react-native-router-flux/issues/2865

这是另一个相关问题:https://github.com/aksonov/react-native-router-flux/issues/2799

【讨论】:

你是我的英雄

以上是关于反应本机路由器通量:TypeError:未定义不是函数(评估'addListener')的主要内容,如果未能解决你的问题,请参考以下文章

如何在本机反应中修复“TypeError:未定义不是对象(评估'_reactNativeCamera.default.constants')”错误?

Android后退按钮处理程序反应本机路由器通量

TypeError:未定义不是对象(评估'array.length')反应原生[关闭]

TypeError:无法读取未定义反应redux的属性“历史”[重复]

未定义不是本机反应中的对象错误

react-native-router-flux 在本机基本页脚选项卡中导航