具有react-navigation和redux的onesignal:打开通知后,我无法导航至屏幕

时间:2018-12-23 11:55:15

标签: javascript react-native react-redux react-navigation onesignal

问题:
打开单信号通知时,我需要导航到屏幕。

情况:
我无法从我的App组件导航,因为导航器尚未定义。
我无法从RootContainer组件进行导航,因为导航器尚未定义。

我考虑了调度动作而不是导航,但还是一样:
我无法从我的App组件中调度操作,因为尚未定义存储。
由于导航尚未定义,我无法从RootContainer组件调度操作。

这是App.js:

gcloud compute firewall-rules create default-allow-ssh --allow tcp:22

如您所见,我尝试将... import const persistConfig = { key: 'root', version: 1, storage, blacklist: ['navigation'] }; const persistedReducer = persistReducer(persistConfig, reducer); const store = createStore(persistedReducer, { is_logged_in: false, login_type: null, access_token: null }, applyMiddleware(logger)); const persistor = persistStore(store); class App extends Component { constructor(props) { super(props); OneSignal.init("..."); this.onOpened = this.onOpened.bind(this); OneSignal.addEventListener('received', this.onReceived); OneSignal.addEventListener('opened', this.onOpened); OneSignal.addEventListener('ids', this.onIds); this.state = { notification_offer_clicked: null }; } componentWillUnmount() { OneSignal.removeEventListener('received', this.onReceived); OneSignal.removeEventListener('opened', this.onOpened); OneSignal.removeEventListener('ids', this.onIds); } onOpened(openResult) { this.setState({ notification_offer_clicked: openResult.notification.payload.additionalData.offer }); } render () { return ( <Provider store={store}> <PersistGate loading={null} persistor={persistor}> <RootContainer notification_offer_clicked={this.state.notification_offer_clicked} /> </PersistGate> </Provider> ) } } export default DebugConfig.useReactotron ? console.tron.overlay(App) : App 属性传递给RootContainer来传播事件。
该道具已正确通过,但我不知道如何从那里继续。

这是Container.js:

notification_offer_clicked

... import class RootContainer extends Component { shouldComponentUpdate(nextProps, nextState) { //if (nextProps.notification_offer_clicked) { // this.props.navigation.navigate('Offer', { 'offer' : nextProps.notification_offer_clicked }); //} return true; } render() { return ( <AppNavigator /> ); } } const mapStateToProps = (state) => { return { is_logged_in: state.is_logged_in, }; }; // wraps dispatch to create nicer functions to call within our component const mapDispatchToProps = (dispatch) => ({ startup: () => dispatch(StartupActions.startup()) }); export default connect(mapStateToProps, mapDispatchToProps)(RootContainer) 是一个AppNavigator变量,所以我不知道如何(如果可能)将道具传递给它。

问题是,如果我尝试降级

  

this.props.navigation.navigate ...

我收到错误原因,原因是StackNavigator尚未在RootContainer中定义。

我的问题是:打开单信号通知时如何导航到屏幕(或简单地调度redux动作)?

1 个答案:

答案 0 :(得分:1)

为什么不在主屏幕中初始化事件监听器? 假设您拥有这种导航架构,

SCREEN1: 
- SUBSCREEN1,
- SUBSCREEN2,

现在,您可以将事件侦听器添加到Screen1组件。 为了采取一种动态的方法,您可以从一个信号中发送路线名称, 例如。一个信号数据包是..

    notifications: {
      payload: {
        additionalData: {
        routeName: 'SUBSCREEN1',
        params: {
          id: 12
        }
       }
     }
   }

然后,您也可以有效地从父级导航到嵌套屏幕,因为您也获得了routeName和props ... 然后,您可以在onOpened侦听器上定义一个简单的函数,比如说onOpened

onOpened = (data) => {
// some validation if there is a data or not,,, if there is
this.props.navigation.navigate(data.notification.payload.additionalData.routeName,data.notification.payload.addtionalData.params);
}

您在此处传递了routeName和props,使其可以导航到具有所需props的任何屏幕,

注意:您始终需要在导航之前验证数据,以减少错误和崩溃的数量。而且您在根组件上不需要事件侦听器。

您不需要它,因为当您单击通知时,它会等到接收到事件侦听器,并在接收到事件侦听器后立即执行最后一个通知,我知道它来自{{1 }}。