如何更改本机模块回调上的react-router-native位置

时间:2019-04-18 01:51:10

标签: react-native react-native-android history react-lifecycle react-router-native

我正在构建一个本机应用程序,该应用程序显示服务叠加层(如那些Facebook Messenger气泡头),仅在Android中实施,然后在叠加层上单击它应返回到特定屏幕上的应用程序。

我正在使用react-router-native,我的路由结构如下:

App.js

<NativeRouter>
    <ApolloProvider client={client}>
        <Main>
            <Switch>
                <Route exact path="/home" component={Home} />
                <Route exact path="/progress" component={RouteProgress} />
                <Route exact path="/search" component={Search} />
            </Switch>            
        </Main>
    </ApolloProvider>
</NativeRouter>

Main组件具有以下特征:

Main.js

componentDidMount() {
    console.log(this.props.location.pathname);
    if(this.props.location.pathname === '/') {
        this.props.history.push("/home");
    }       
}

来自本机模块的回调被这样调用:

FloatingView.java

case MotionEvent.ACTION_UP:
        if (lastAction == MotionEvent.ACTION_DOWN || delta < 3) {
            Intent intent = new Intent(FloatingWindow.this, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent);

            FloatingViewPackage.callback.invoke();                                              

            stopSelf();
        }

回调在组件Search中定义,该组件还执行本地模块:

Search.js

<Button onPress={() => FloatingView.init(() => {
    console.log('go to progress 1');
    this.props.history.push("/progress");

    setTimeout(() => {
        console.log('go to progress 2');
        this.props.history.push("/progress");
    }, 1000);
})}

问题在于this.props.history.push("/progress");既不在超时范围内也不在超时范围内工作。 在超时之外,该函数在Main componentDidMount之前被调用,但是location.pathname未更新。在其中内部会调用此函数,但不会导航到右侧屏幕。它总是属于/home

我认为这是一个生命周期问题,因为未安装Search组件。我一直在努力寻找解决方案。我尝试使用Redirect组件:

<Button onPress={() => FloatingView.init(() => <Redirect to="/progress" />)}

反正还能想办法解决吗?谢谢

1 个答案:

答案 0 :(得分:0)

找到了一种解决方案,不知道最好的解决方案,但是它可以工作。

创建了一个单例navigation.js

navigation.js

export default {
    entryPoint: '/home'
};

并更改了以下文件:

Search.js

<Button onPress={() => FloatingView.init(() => {
   navigation.entryPoint = "/progress";
})}

Main.js

componentDidMount() {
    if(this.props.location.pathname === '/') {
        this.props.history.push(navigation.entryPoint);
    }       
}