Flutter Andriod Kotlin 通信Demo

33 min read

定义Channel

package com.example.flutter_android
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel

class MethodChannelDemo(messenger: BinaryMessenger): MethodChannel.MethodCallHandler {

    private var channel: MethodChannel

    init {
        channel = MethodChannel(messenger, "com.flutter.guide.MethodChannel")
        channel.setMethodCallHandler(this)
    }


    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
        if (call.method == "sendData") {
            val name = call.argument("name") as String?
            val age = call.argument("age") as Int?

            val map = mapOf("name" to "hello,$name",
                "age" to "$age"
            )
            result.success(map)
        }
    }
}
  • call.method 字符串就是 invokeMethod 方法传入的 method
  • call.argument 是 invokeMethod 传入的参数,由于 Flutter 端传入的是 Map,所以上面的解析按照 Map 解析。
  • result.success() 是返回给 Flutter 的结果。

MainActivity 启动

package com.example.flutter_android

import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine

class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannelDemo(flutterEngine.dartExecutor.binaryMessenger)
    }
}

Flutter端

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(const MethodChannelDemo());
}

class MethodChannelDemo extends StatefulWidget {
  const MethodChannelDemo({Key? key}) : super(key: key);

  @override
  MethodChannelDemoState createState() => MethodChannelDemoState();
}

class MethodChannelDemoState extends State<MethodChannelDemo> {
  var channel = const MethodChannel('com.flutter.guide.MethodChannel');
  var data = 'No data';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: Column(
          children: [
            const SizedBox(
              height: 50,
            ),
            TextButton(
              child: const Text('发送数据到原生'),
              onPressed: () async {
                var result = await channel.invokeMethod(
                    'sendData', {'name': 'test', 'age': 18});
                var name = result['name'];
                var age = result['age'];
                setState(() {
                  data = '$name,$age';
                });
              },
            ),
            Text('原生返回数据:$data')
          ],
        ),
      ),
    );
  }
}