我正在构建一个本机应用程序,该应用程序显示服务叠加层(如那些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" />)}
反正还能想办法解决吗?谢谢
答案 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);
}
}