How to pass a message from Flutter to Native?

AndroidIosDartFlutter

Android Problem Overview


How would you pass info from Flutter back to Android/Native code if needed to interact with a specific API / hardware component?

Are there any Event Channels that can send info the other way or something similar to a callback?

  1. The platform_channel documentation points out "method calls can also be sent in the reverse direction, with the platform acting as client to methods implemented in Dart. A concrete example of this is the quick_actions plugin." I don't see how the native side is receiving a message from Flutter in this instance.
  2. It looks like a BasicMessageChannel’s send() method can be used to send "the specified message to the platform plugins on this channel". Can anyone provide a simple implementation example of this?

Android Solutions


Solution 1 - Android

This is a simple implementation showcasing :

  1. Passing a string Value from flutter to Android code
  2. Getting back response from Android code to flutter

code is based on example from :https://flutter.io/platform-channels/#codec

1.Passing string value "text" :

String text = "whatever";

Future<Null> _getBatteryLevel(text) async {
String batteryLevel;
try {
  final String result = await platform.invokeMethod('getBatteryLevel',{"text":text}); 
  batteryLevel = 'Battery level at $result % .';
} on PlatformException catch (e) {
  batteryLevel = "Failed to get battery level: '${e.message}'.";
}

setState(() {
  _batteryLevel = batteryLevel;
});

}

2.Getting back response "batterylevel" after RandomFunction();

 public void onMethodCall(MethodCall call, MethodChannel.Result result) {
                    if (call.method.equals("getBatteryLevel")) {

                        text = call.argument("text");
                        String batteryLevel = RandomFunction(text);

                        if (batteryLevel != null) {
                            result.success(batteryLevel);
                        } else {
                            result.error("UNAVAILABLE", "Battery level not available.", null);
                        }
                    } else {
                        result.notImplemented();
                    }
                }

Hope this helps!

Solution 2 - Android

Objective C

call.arguments[@"parameter"]

Android

call.argument("parameter");

Solution 3 - Android

Yes, flutter does has an EventChannel class which is what you are looking for exactly.

Here is an example of that demonstrates how MethodChannel and EventChannel can be implemented. And this medium article shows how an EventChannel can be implemented in flutter.

Hope that helped!

Solution 4 - Android

for swift

    guard let args = call.arguments as? [String : Any] else {return}
    let phoneNumber = args["contactNumber"] as! String
    let originalMessage = args["message"] as! String

Solution 5 - Android

If anyone wants to share the data from native to flutter with invoke method follow this:

main.dart

Future<dynamic> handlePlatformChannelMethods() async {
  platform.setMethodCallHandler((methodCall) async {
   if (methodCall.method == "nativeToFlutter") {
     String text = methodCall.arguments;
     List<String> result = text.split(' ');
     String user = result[0];
     String message = result[1];
    }
   }
  }

MainActivity.java

 nativeToFlutter(text1:String?,text2:String?){
 MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger, 
  CHANNEL.invokeMethod("nativeToFlutter",text1+" "+text2);
 }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAdam HurwitzView Question on Stackoverflow
Solution 1 - AndroidUpaJahView Answer on Stackoverflow
Solution 2 - AndroidÁlvaro AgüeroView Answer on Stackoverflow
Solution 3 - AndroidHemanth RajView Answer on Stackoverflow
Solution 4 - AndroidAlexa289View Answer on Stackoverflow
Solution 5 - AndroidDivya SinghalView Answer on Stackoverflow