React native react本机路由器流量抛出操作。未定义回调

React native react本机路由器流量抛出操作。未定义回调,react-native,react-native-router-flux,React Native,React Native Router Flux,运行以下代码段将导致路由器抛出 import React from 'react'; import {Scene, Router} from 'react-native-router-flux'; export default App extends React.Component { componentDidMount() { // This fails Actions.login(); } render() { return ( &

运行以下代码段将导致路由器抛出

import React from 'react';
import {Scene, Router} from 'react-native-router-flux';

export default App extends React.Component {
  componentDidMount() {
      // This fails
      Actions.login();
  }

  render() {
    return (
      <Router>
        <Scene key="root" hideNavBar>
          <Scene key="login" component={Login} />
          <Scene key="main" component={Main} initial />
        </Scene>
      </Router>
    );
  }
}
从“React”导入React;
从“react native Router flux”导入{Scene,Router};
导出默认应用程序扩展React.Component{
componentDidMount(){
//这失败了
Actions.login();
}
render(){
返回(
);
}
}
路由器应该由App.componentDidMount安装,因此所有操作都应该正常工作。
如果我将超时时间设置为2秒,那么它确实有效。
有人碰到过吗?我在这里做错了什么吗?

所以我终于明白了问题所在。
问题不在于场景需要时间初始化。
Action.login需要具有路由器在第一次实际呈现(根组件DidMount之后)后注入的Actions.callback

发生的情况如下:
根渲染函数调用
在没有state.reducer的情况下调用路由器渲染函数,因此不执行任何操作。
调用Router componentDidMount-在这里,操作被初始化,还原程序被保存到状态(setState是异步的)。
根componentDidMount-此处回调仍未初始化。
路由器渲染调用-此调用由之前的设置状态触发。现在,Actions.callback被注入

因此,在第二次渲染之后,路由器被初始化

我设法找到了比任意设置超时更好的解决方案。
覆盖路由器渲染方法,并在使用数据渲染后立即通知父级:

class OverrideRouter extends Router {
    constructor(props) {
        super(props);
        this.render = this.overrideRender;
    }
    overrideRender() {
        const result = super.render();
        if (!result) {
            return result;
        }
        // after first initialization use the regular render.
        this.render = super.render;
        if (this.props.onRouterInitialize) {
            // need this setTimeout to allow this method to complete so that the Actions.callback is populated
            setTimeout(this.props.onRouterInitialize, 10);
        }
        return result;
    }
}
编辑
我设法完全解决了这个问题,并发送了一个请求来解决它。