android如何原生调用flutter方法

在Android原生项目中集成了Flutter模块,现在需要从Android原生代码调用Flutter端的方法,该如何实现?具体步骤是什么?是否需要通过MethodChannel来通信?能否提供一个完整的示例代码,包括Android端和Flutter端的实现?

2 回复

在Android中,可以通过MethodChannel调用Flutter方法。在Flutter端注册方法,Android端使用MethodChannel发送消息并接收结果。

更多关于android如何原生调用flutter方法的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Android 原生代码中调用 Flutter 方法,可以通过 MethodChannel 实现双向通信。以下是详细步骤:

1. Flutter 端设置

在 Flutter 中创建 MethodChannel 并设置方法调用处理器:

import 'package:flutter/services.dart';

class FlutterMethods {
  static const MethodChannel _channel = MethodChannel('com.example.app/channel');

  static void setupMethodCallHandler() {
    _channel.setMethodCallHandler((call) async {
      switch (call.method) {
        case 'getMessage':
          return 'Hello from Flutter!';
        case 'calculateSum':
          final args = call.arguments as Map;
          return args['a'] + args['b'];
        default:
          throw PlatformException(code: 'not_implemented');
      }
    });
  }
}

main() 中初始化:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  FlutterMethods.setupMethodCallHandler();
  runApp(MyApp());
}

2. Android 原生端调用

在 Activity 或 Fragment 中通过 MethodChannel 调用 Flutter 方法:

import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "com.example.app/channel"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)

        // 调用无参数方法
        channel.invokeMethod("getMessage", null, object : MethodChannel.Result {
            override fun success(result: Any?) {
                Log.d("Flutter", "Received: $result")
            }
            override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
                Log.e("Flutter", "Error: $errorMessage")
            }
            override fun notImplemented() {
                Log.e("Flutter", "Method not implemented")
            }
        })

        // 调用带参数方法
        val args = hashMapOf("a" to 10, "b" to 20)
        channel.invokeMethod("calculateSum", args, object : MethodChannel.Result {
            override fun success(result: Any?) {
                val sum = result as Int
                Log.d("Flutter", "Sum: $sum")
            }
            override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {
                Log.e("Flutter", "Error: $errorMessage")
            }
            override fun notImplemented() {
                Log.e("Flutter", "Method not implemented")
            }
        })
    }
}

关键点说明:

  1. 通道名称一致:Flutter 和 Android 的 MethodChannel 名称必须完全相同。
  2. 数据类型匹配:参数和返回值类型需在两端保持一致(如 Map、List、基本类型)。
  3. 异步处理invokeMethod 是异步操作,结果通过回调返回。
  4. 错误处理:务必实现 errornotImplemented 回调。

通过这种方式,Android 原生代码可以安全地调用 Flutter 中定义的任何方法。

回到顶部