How to pass a message from Flutter to Native?
Asked Answered
S

6

62

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?
Sullyprudhomme answered 4/3, 2018 at 19:18 Comment(0)
K
111

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();
        }
    }
    
Kkt answered 15/3, 2018 at 19:58 Comment(9)
how to get a list of stringUnderdone
@Underdone do you have the answer?Iverson
I solved my problem using other method. #52456513Underdone
@Underdone I have find a solution to do it on the good way. If you are still interested, let me knowIverson
Please add your answer in my so question. @IversonUnderdone
For more information, you can refer this: medium.com/@milindmevada/…Minotaur
You can find the detailed information on the battery level example here: flutter.dev/docs/development/platform-integration/…Denten
how to pass custom object like user or employee from flutter to android ?Lysenko
can someone tell me why it doesnt work on ios? @Kkt 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; });Holocaust
R
8

Objective C

call.arguments[@"parameter"]

Android

call.argument("parameter");
Rhoda answered 3/7, 2019 at 21:27 Comment(5)
What about android?Geronimo
Android - Java ---> call.argument("parameter");Nasal
how about in kotlinStome
@HZan, in Kotlin: val s: String? = call.argument("parameter")Hex
@HZan What about the CPP window side?Watermark
P
7

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!

Palladino answered 5/3, 2018 at 5:18 Comment(0)
L
6

for swift

    guard let args = call.arguments as? [String : Any] else {return}
    let phoneNumber = args["contactNumber"] as! String
    let originalMessage = args["message"] as! String
Lammond answered 2/6, 2021 at 9:37 Comment(0)
S
6

Passing from Flutter to native:

await platform.invokeMethod(
  'runModel', 
  {'path': imagePath!.path} // 'path' is the key here to be passed to Native side
);

For Android (Kotlin):

val hashMap = call.arguments as HashMap<*,*> //Get the arguments as a HashMap

val path = hashMap["path"] //Get the argument based on the key passed from Flutter

For iOS (Swift):

guard let args = call.arguments as? [String : Any] else {return}
let text = args["path"] as! String
Shrine answered 13/6, 2022 at 10:44 Comment(0)
C
0

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);
 }
Cacique answered 8/9, 2021 at 17:22 Comment(2)
How could I share the data from flutter to Android native.Admissible
Hi, you can follow this linkCacique

© 2022 - 2024 — McMap. All rights reserved.