我目前正在使用Redux,状态管理和Firebase Cloud Messaging构建我的实时通信的React Native应用程序。
要在Android you are required的后台使用FCM创建名为bgMessaging.js
的文件。
// @flow
import firebase from 'react-native-firebase';
// Optional flow type
import type { RemoteMessage } from 'react-native-firebase';
export default async (message: RemoteMessage) => {
// handle your message
return Promise.resolve();
}
我的问题是我需要在这里调度一个动作。我为此找到的唯一解决方案是导入我的商店并调用store.dispatch()
。有人告诉我这是一种反模式,被认为是不好的做法。我还能怎么做不是反模式?
编辑: 马克·埃里克森(Mark Erikson)本人是如此善良,gave his opinion on this topic。谢谢马克!
答案 0 :(得分:2)
编写应用程序时,我也遇到了相同的情况。我使用React Native App的方法是创建React组件,但是要在React Components之外处理很多数据获取/处理-因为我不知道我是否一直都在使用React,但是我想为我的其他Type / JavaScript项目创建可重复使用的模块。例如,我创建了一些处理各种API的帮助程序文件,但是当我将Redux集成到项目中时,我遇到了同样的问题。如何在不重新添加到您的商店的情况下进行分派(如我所见,这可以视为反模式)。
通读几篇文章,没有真实的地方暗示这种方法是“反模式”。很多时候,商店是在React Context中导入的(这不是必需的)-这是Anti Pattern。在您的用例中,我并没有真正看到Anti Pattern是怎么回事,当我做同样的事情时,我当然得出了这个结论。在我看来,应用程序的“通用”部分应由应用程序的许多其他部分使用。
答案 1 :(得分:0)
我看到的是,您需要提供一个具有单个arg的函数,类型为RemoteMessage
并返回一个承诺,并且需要将该函数提供给registerHeadlessTask
(包装在出于某种原因的另一个功能。.)
如果您的bgMessaging文件看起来像这样。
// @flow
import firebase from 'react-native-firebase';
// Optional flow type
import type { RemoteMessage } from 'react-native-firebase';
export default store => {
return async (message: RemoteMessage) => {
// handle your message
store.dispatch();
return Promise.resolve();
}
}
并且在索引中。.
import bgMessaging from './src/bgMessaging';
const store = redux.createStore();
const bgMessagingFn = bgMessaging(store);
// Current main application
AppRegistry.registerComponent('ReactNativeFirebaseDemo', () => bootstrap);
// New task registration
AppRegistry.registerHeadlessTask('RNFirebaseBackgroundMessage', () => bgMessagingFn);