JiaWei
JiaWei

Reputation: 1

Broadcast Receiver Can't Pass Received Data To Flutter

I have two apps (POS and Kiosk) running on an android so I use broadcast receiver to pass the order from kiosk to pos. If the customer clicked on the order button, kiosk app will send the order items to pos app and call the _handleOrder function in pos app. I managed to pass the orderData and receive at pos but somehow I can't process the received orderData further.

kiosk.dart

try {
      Map<String, dynamic> data = {
        'confirm_order': 1,
        'data': ConfigJade2Data.configMenus(widget.selectedItems.keys.toList(),
            widget.selectedItems, widget.dineMode),
        'is_take_away': widget.dineMode == DineMode.dineIn ? 0 : 1,
        'userid': global.userId,
        'kioskName': global.kioskName,
      };

      Map<String, dynamic> wrappedData = {
        'orderData': data,
      };

      print('^^^^^^^^^^^^^^^^^^Sending order via Intent: $wrappedData');

      try {
        await platform.invokeMethod('sendOrder', wrappedData);
        print('%%%%%%%%% Order sent via Intent %%%%%%%%%');
      } catch (e) {
        print('Failed to send order: $e');
      }
      return null;
    } catch (e) {
      print('Failed to send order: $e');
      return null;
    }

MainActivity.java (kiosk)

new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), ORDER_CHANNEL)
      .setMethodCallHandler((call, result) -> {
        if (call.method.equals("sendOrder")) {
          HashMap<String, Object> arguments = call.arguments();
          if (arguments.containsKey("orderData")) {
            Object orderData = arguments.get("orderData");
            if (orderData instanceof HashMap) {
              JSONObject jsonObject = new JSONObject((HashMap<String, Object>) orderData);
              Intent intent = new Intent("cim.loself.jade.ORDER_ACTION");
              intent.putExtra("orderData", jsonObject.toString());
              sendBroadcast(intent);
              result.success("Order sent via Intent");
            } else {
              result.error("INVALID_DATA_TYPE", "orderData is not of type HashMap", null);
            }
          } else {
            result.error("MISSING_DATA", "orderData is missing", null);
          }
        } else {
          result.notImplemented();
        }
      });

MainActivity.java (pos)

package cim.loself.jade;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;
import android.content.IntentFilter;

import java.util.HashMap;

public class MainActivity extends FlutterActivity {

    private static final String ORDER_CHANNEL = "order_channel";
    private OrderReceiver orderReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Register the broadcast receiver
        orderReceiver = new OrderReceiver();
        IntentFilter filter = new IntentFilter("cim.loself.jade.ORDER_ACTION");
        registerReceiver(orderReceiver, filter);
    }

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);

        // MethodChannel to send orders
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), ORDER_CHANNEL)
            .setMethodCallHandler((call, result) -> {
                if (call.method.equals("sendOrder")) {
                    HashMap<String, Object> arguments = call.arguments();
                    if (arguments.containsKey("orderData")) {
                        Object orderData = arguments.get("orderData");
                        if (orderData instanceof HashMap) {
                            Intent intent = new Intent("cim.loself.jade.ORDER_ACTION");
                            intent.putExtra("orderData", orderData.toString());
                            sendBroadcast(intent);
                            result.success("Order sent via Intent");
                        } else {
                            result.error("INVALID_DATA_TYPE", "orderData is not of type HashMap", null);
                        }
                    } else {
                        result.error("MISSING_DATA", "orderData is missing", null);
                    }
                } else {
                    result.notImplemented();
                }
            });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(orderReceiver);
    }

    public class OrderReceiver extends BroadcastReceiver {
        private static final String CHANNEL = "order_channel";

        @Override
        public void onReceive(Context context, Intent intent) {
            if ("cim.loself.jade.ORDER_ACTION".equals(intent.getAction())) {
                String orderData = intent.getStringExtra("orderData");
                Log.d("OrderReceiver", "POS received order data: " + orderData);

                // Use the FlutterEngine provided by FlutterActivity
                FlutterEngine flutterEngine = getFlutterEngine();

                if (flutterEngine != null) {
                    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
                        .invokeMethod("onReceiveOrder", orderData, new MethodChannel.Result() {
                            @Override
                            public void success(Object result) {
                                Log.d("OrderReceiver", "Flutter method invocation success");
                            }

                            @Override
                            public void error(String errorCode, String errorMessage, Object errorDetails) {
                                Log.e("OrderReceiver", "Error: " + errorMessage);
                            }

                            @Override
                            public void notImplemented() {
                                Log.e("OrderReceiver", "Not Implemented");
                            }
                        });
                } else {
                    Log.e("OrderReceiver", "FlutterEngine is null");
                }
            }
        }
    }
}

The line:

Log.d("OrderReceiver", "POS received order data: " + orderData);

did printed out correctly follow by:

I/flutter (24630): %%%%%%%%% Order sent via Intent %%%%%%%%%

and nothing printed after this. Did i set the flutter engine or channel method wrongly?

Upvotes: 0

Views: 47

Answers (0)

Related Questions