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);
}