Reputation: 1
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