Flutter Android插件回传数据

在 Flutter 开发中,我们经常需要与原生代码进行交互,比如调用原生方法获取设备信息、打开相机等操作。而有时,我们还需要从原生代码返回一些数据给 Flutter。本文将介绍如何在 Flutter 中调用 Android 插件,并在插件中回传数据给 Flutter。

Flutter 调用 Android 插件

首先,我们需要在 Flutter 中调用 Android 插件。Flutter 提供了一个名为 MethodChannel 的类来实现与原生代码的通信。下面是一个简单的例子,演示了如何使用 MethodChannel 调用 Android 插件并获取返回值。

首先,在 Flutter 中创建一个按钮,当点击按钮时调用 Android 插件的方法:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  static const platform = MethodChannel('com.example/plugin');

  void _getDeviceInfo() async {
    String result;
    try {
      result = await platform.invokeMethod('getDeviceInfo');
    } on PlatformException catch (e) {
      result = 'Failed to get device info: ${e.message}';
    }
    print(result);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter Plugin Example')),
        body: Center(
          child: RaisedButton(
            child: Text('Get Device Info'),
            onPressed: _getDeviceInfo,
          ),
        ),
      ),
    );
  }
}

上述代码中,我们创建了一个 MethodChannel 实例,并指定了一个与插件通信的标识符。然后,我们定义了一个 _getDeviceInfo 方法,该方法通过调用 invokeMethod 函数来调用 Android 插件中的 getDeviceInfo 方法。如果调用成功,我们将获取到的结果打印出来。

接下来,在 Android 项目中创建一个 Flutter 插件,并在插件中实现 getDeviceInfo 方法:

import io.flutter.embedding.engine.FlutterEngine
import io.flutter.embedding.engine.dart.DartExecutor.DartCallback
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity : FlutterFragmentActivity() {
    private val CHANNEL = "com.example/plugin"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)

        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "getDeviceInfo") {
                val deviceInfo = getDeviceInfo()
                result.success(deviceInfo)
            } else {
                result.notImplemented()
            }
        }
    }

    private fun getDeviceInfo(): String {
        // 获取设备信息逻辑
        return "Device Info"
    }
}

上述代码中,我们首先注册了 Flutter 插件,然后通过 MethodChannel 创建了一个与 Flutter 通信的通道。在 setMethodCallHandler 方法中,我们定义了一个回调函数,用于处理 Flutter 中调用插件方法的请求。在该回调函数中,我们根据接收到的方法名执行相应的逻辑,并通过 result 参数返回结果给 Flutter。

这样,当我们点击 Flutter 应用中的按钮时,就会调用 Android 插件的 getDeviceInfo 方法,并将结果打印出来。

Android 插件回传数据给 Flutter

接下来,我们将介绍如何在 Android 插件中回传数据给 Flutter。Flutter 提供了 MethodChannelinvokeMethod 函数来实现向 Flutter 发送消息。

修改上述 Android 插件代码,在 getDeviceInfo 方法中添加回传数据的逻辑:

private fun getDeviceInfo(): String {
    val deviceInfo = "Device Info"

    Handler(Looper.getMainLooper()).postDelayed({
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
            .invokeMethod("onDeviceInfo", deviceInfo)
    }, 3000)

    return deviceInfo
}

上述代码中,我们使用 HandlerpostDelayed 方法来模拟一个异步操作,并在 3 秒后调用 MethodChannelinvokeMethod 函数向 Flutter 发送数据。在此之前,我们先返回设备信息(这里假设设备信息是 "Device Info")。

然后,在 Flutter 中注册一个监听器来接收从 Android 插件中回传的数据:

class MyApp extends StatelessWidget {
  static const platform = MethodChannel('com.example/plugin');

  Future<void> _getDeviceInfo()