0

我目前正在使用 Redux、状态管理和 Firebase Cloud Messaging 构建一个 React Native 应用程序,用于我的实时通信。

要在 Android 的后台使用 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(). 有人告诉我这是一种反模式,被认为是不好的做法。除了反模式,我还能做什么?

编辑: 马克·埃里克森本人非常友善,并就这个话题发表了自己的看法。谢谢马克!

4

2 回答 2

2

在编写我的应用程序时,我也遇到了同样的情况。我对我的 React Native 应用程序的方法是创建 React 组件,但在 React 组件之外处理我的大量数据获取/处理 - 因为我不知道我是否会一直使用 React,但想为我的其他 Type/JavaScript 项目创建可重用的模块。例如,我创建了一些处理各种 API 的帮助文件,但是当我将 Redux 集成到我的项目中时 - 我遇到了同样的问题。我如何在不重新添加到您的商店的情况下进行调度(我可以看到这可以被认为是反模式)。

阅读几篇文章,没有真正的地方表明这种方法是“反模式”。很多时候,商店是在 React 上下文中导入的(这并不需要)——这就是反模式。在您的用例中,我真的不明白这怎么可能是反模式,当我做同样的事情时,我当然得出了这个结论。在我看来,应用程序的“通用”部分应该被应用程序的许多其他部分使用。

于 2018-09-25T13:00:47.470 回答
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);
于 2018-09-25T11:46:00.213 回答