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 提供了 MethodChannel
的 invokeMethod
函数来实现向 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
}
上述代码中,我们使用 Handler
和 postDelayed
方法来模拟一个异步操作,并在 3 秒后调用 MethodChannel
的 invokeMethod
函数向 Flutter 发送数据。在此之前,我们先返回设备信息(这里假设设备信息是 "Device Info"
)。
然后,在 Flutter 中注册一个监听器来接收从 Android 插件中回传的数据:
class MyApp extends StatelessWidget {
static const platform = MethodChannel('com.example/plugin');
Future<void> _getDeviceInfo()