Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有react navigation和redux的onesignal:打开通知时,我无法导航到屏幕_Javascript_React Native_React Redux_React Navigation_Onesignal - Fatal编程技术网

Javascript 带有react navigation和redux的onesignal:打开通知时,我无法导航到屏幕

Javascript 带有react navigation和redux的onesignal:打开通知时,我无法导航到屏幕,javascript,react-native,react-redux,react-navigation,onesignal,Javascript,React Native,React Redux,React Navigation,Onesignal,问题: 当onesignal通知打开时,我需要导航到屏幕 形势: 我无法从我的应用程序组件导航,因为尚未定义导航器。 我无法从我的RootContainer组件导航,因为导航器尚未定义 我考虑的是分派操作,而不是导航,但都是一样的: 我无法从我的应用程序组件发送操作,因为尚未定义存储。 我无法从我的RootContainer组件分派操作,因为导航尚未定义 这是App.js: ... import const persistConfig = { key: 'root', vers

问题:
当onesignal通知打开时,我需要导航到屏幕

形势:
我无法从我的应用程序组件导航,因为尚未定义导航器。
我无法从我的RootContainer组件导航,因为导航器尚未定义

我考虑的是分派操作,而不是导航,但都是一样的:
我无法从我的应用程序组件发送操作,因为尚未定义存储。
我无法从我的RootContainer组件分派操作,因为导航尚未定义

这是App.js:

... 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
AppNavigator
是一个
StackNavigator
变量,所以我不知道如何(如果可能的话)向它传递道具

问题是,如果我试图取消

这个。道具。导航。导航

行I获取错误原因
导航
尚未在RootContainer中定义


我的问题是:当我打开onesignal通知时,如何导航到屏幕(或简单地发送redux操作?

为什么不在主屏幕中初始化事件侦听器? 假设你有这个导航架构

SCREEN1: 
- SUBSCREEN1,
- SUBSCREEN2,
现在,您可以将事件侦听器添加到Screen1组件中。 为了进行动态接近,你可以从一个信号发送路线名称, 例如一个信号数据包是

    notifications: {
      payload: {
        additionalData: {
        routeName: 'SUBSCREEN1',
        params: {
          id: 12
        }
       }
     }
   }
然后,您可以有效地从父屏幕导航到嵌套屏幕,因为您还获得了routeName和道具。。。 然后你可以在你的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导航到任何屏幕

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


你不需要这样做,因为当你点击通知时,它会等待直到它收到一个事件监听器,一旦它收到事件监听器,它就会执行最后一个通知。我知道这是一个奇怪的行为,来自
onesignal

我使用了onesignal文档中编写的代码。这就是为什么我把它放在应用程序文件中的原因。你不需要它……我会更新我的答案,说明我在生产应用程序中使用这种方法的原因,而且它工作正常。我不理解listenerOk……所以基本上,如果你有两个屏幕,屏幕1,屏幕2,你现在在屏幕1上,但是screen2是事件监听器初始化的地方,当你收到通知时,如果你点击它,什么也不会发生。当你在一段时间后导航到screen2时,OnOpen函数将启动,因此它会等待事件监听器。这就是原因,在根组件中不需要侦听器,很难这样解释。如果有帮助,请告诉我。
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);
}