Push Callback

Push Click Callback

MoEngage's Flutter plugin optionally provides a callback on push clicks.

To register for the callback, call the setPushClickCallbackHandler() on the MoEngageFlutter object in your dart code.
This API takes a method as input with whose typedef is PushClickCallbackHandler(PushCampaignData data).


import 'package:moengage_flutter/moengage_flutter.dart';
import 'package:moengage_flutter/model/push/push_campaign_data.dart';

void _onPushClick(PushCampaignData message) {
    print("_onPushClick(): Push click callback from native to flutter. Payload " +

final MoEngageFlutter _moengagePlugin = MoEngageFlutter(YOUR_APP_ID);

Make sure this callback is set as soon as the application is initialized. Preferably in the initState() of your application widget.

Make sure the callback is set before calling the initialize () of the MoEngage Plugin.


NotificationPayload received in the callback is an PushCampaignData instance with the following definition:


class PushCampaignData {
  Platforms platform;
  AccountMeta accountMeta;
  PushCampaign data;
platform - Native platform from which callback is triggered. Possible values - androidios.
data - PushCampaignData object
class PushCampaign {
  bool isDefaultAction;
  Map<String, dynamic> clickedAction;
  Map<String, dynamic> payload;

isDefaultAction - This key is present only for the Android Platform. It's a boolean value indicating if the user clicked on the default content or not. true if the user clicks on the default content else false.

clickedAction - Action to be performed on notification click.

Payload Structure for clickedAction Map

  "clickedAction": {
    "type": "navigation/customAction",
    "payload": {
      "type": "screenName/deepLink/richLanding",
      "value": "",
      "kvPair": {
        "key1": "value1",
        "key2": "value2",

clickedAction.type- Type of click action. Possible values navigation and customAction. Currently, customAction is supported only on Android.
clickAction.payload - Action payload for the clicked action.
clickedAction.payload.type - Type of navigation action defined. Possible values screenName, deepLink,  and richLanding.

Currently, in the case of iOS, rich landing and deep-link URLs are processed internally by the SDK and not passed in this callback; therefore possible value in the case of iOS is only screenName.
clickAction.value - value entered for navigation action or custom payload.
clickAction.kvPair - Custom key-value pair entered on the MoEngage Platform.
payload - Complete campaign payload.

Android Payload

If the user clicks on the default content of the notification, the key-value pair and campaign payload can be found inside the payload key. If the user clicks on the action button or a push template action, the action payload would be found inside clickedAction.
You can use the isDefaultAction key to check whether the user clicked on the default content and then parse the payload accordingly.

iOS Payload

In the case of iOS, you would always receive the key-value pairs for clicked action in the clickedAction property. Refer to this link to knowing the iOS notification payload structure.

Self-Handled Push Click(Optional)(Only Android)

In Android, when the user clicks the Notification, the SDK does the redirection & passes the callback to the Application. If you want to handle redirection by yourself when the app is in the foreground state, you need to initialize it like the below.

While initializing the MoEngage Flutter Plugin, add the below push config option in the MoEngageFlutter constructor.

final MoEngageFlutter _moengagePlugin = MoEngageFlutter("<MOE_APP_ID>",
moEInitConfig: MoEInitConfig(pushConfig:PushConfig(shouldDeliverCallbackOnForegroundClick: true)));



If you're enabling the above option, you must handle the redirection for Deeplinking & Navigate to Screen on your own by checking selfHandledPushRedirection flag in PushCampaignData like below. 

  void _onPushClick(PushCampaignData message) {
      if (message.data.selfHandledPushRedirection) {
	// Handle Redirection for Deeplinking or ScreenName
      } else {
	// Callback After SDK Handled Redirection
Add the below Activity to your AndroidManifest.xml under <application> tag.

<manifest ...>
    <application ...>
            tools:replace="android:launchMode" />



In most cases, this step is not required. This is only if you want the SDK to not do any redirection when the notification is clicked in the foreground state (RichLanding actions will still be handled from SDK). 
If you just want to get the callback, check the Push Click Callback.

If the self-handled foreground push is handled, it is highly recommended to use LifeCycle Aware Callbacks also.


LifeCycle Aware Callbacks

The Lifecycle Aware Callbacks should be used if you need to get the callbacks in Flutter based on app life cycle state changes. This is optional in most cases.

Android Configuration

To support self-handled foreground push click, the below configuration is required while initializing Native Android SDK by passing the lifecycleAwareCallbackEnabled flag as true.


val moEngage = MoEngage.Builder(this, "Your App Id")
MoEInitializer.initializeDefaultInstance(applicationContext, moEngage, true)


Flutter Configuration

If the life cycle aware callback flag is enabled in Native SDK, you also need to call initialise() in the flutter whenever the app comes to foreground by adding WidgetsBindingObserver in the root widget of your app.
So you would need to call initialise() in two places, one in initState() as usual and another time in didChangeAppLifecycleState() in the root widget of your app.

class MyApp extends StatefulWidget {
  _MyAppState createState() => _MyAppState();

class _MyAppState extends State with WidgetsBindingObserver {
  final MoEngageFlutter _moengagePlugin = MoEngageFlutter("<Your_APP_ID>");

  void initState() {
    _moengagePlugin.initialise(); // Initialise MoEngage SDK

  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.resumed) {
      _moengagePlugin.initialise(); //Call initialise() again in on App Resume State
Was this article helpful?
0 out of 0 found this helpful