Flutter与Android互通的常用方式实现与适用场景详解
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1. 平台通道(Platform Channels)</li><ul class="second_class_ul"><li>类型</li><li>示例(MethodChannel)</li></ul><li>2. 插件(Plugins)</li><ul class="second_class_ul"><li>使用步骤</li><li>自定义插件</li></ul><li>3. 平台视图(Platform Views)</li><ul class="second_class_ul"></ul><li>4. 直接调用原生 Activity/Service</li><ul class="second_class_ul"></ul><li>5. 数据共享</li><ul class="second_class_ul"></ul><li>6. FFI(Foreign Function Interface)</li><ul class="second_class_ul"></ul><li>如何选择</li><ul class="second_class_ul"></ul><li>注意事项</li><ul class="second_class_ul"></ul></ul></div><p>Flutter 与 Android 的互通主要通过以下几种方式实现,每种方式适用于不同的场景:</p><p class="maodian"></p><h2>1. 平台通道(Platform Channels)</h2>
<p>Flutter 与原生 Android 代码通信的核心方式,支持双向调用。</p>
<p class="maodian"></p><h3>类型</h3>
<ul><li><strong>MethodChannel</strong>:双向方法调用(最常用)</li><li><strong>EventChannel</strong>:用于原生向 Flutter 发送事件流(如传感器数据)</li><li><strong>BasicMessageChannel</strong>:简单的消息传递(较少使用)</li></ul>
<p class="maodian"></p><h3>示例(MethodChannel)</h3>
<div class="jb51code"><pre class="brush:java;">// Flutter 侧(Dart)
const channel = MethodChannel('com.example/app');
Future<void> getNativeData() async {
try {
final String result = await channel.invokeMethod('getData');
print('原生返回: $result');
} on PlatformException catch (e) {
print('调用失败: ${e.message}');
}
}
</pre></div>
<div class="jb51code"><pre class="brush:java;">// Android 侧(Kotlin)
class MainActivity : FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example/app").setMethodCallHandler { call, result ->
if (call.method == "getData") {
result.success("Hello from Android!")
} else {
result.notImplemented()
}
}
}
}
</pre></div>
<p class="maodian"></p><h2>2. 插件(Plugins)</h2>
<p>封装原生功能的可复用模块,社区或官方提供(如相机、定位等)。</p>
<p class="maodian"></p><h3>使用步骤</h3>
<p><strong>添加依赖</strong>(<code>pubspec.yaml</code>):</p>
<div class="jb51code"><pre class="brush:yaml;">dependencies:
url_launcher: ^6.0.0
</pre></div>
<p><strong>调用插件</strong>:</p>
<div class="jb51code"><pre class="brush:java;">import 'package:url_launcher/url_launcher.dart';
Future<void> launchURL() async {
if (await canLaunch('https://flutter.dev')) {
await launch('https://flutter.dev');
}
}
</pre></div>
<p class="maodian"></p><h3>自定义插件</h3>
<p>通过 <code>flutter create --template=plugin</code> 生成插件模板,自动生成平台通道代码。</p>
<p class="maodian"></p><h2>3. 平台视图(Platform Views)</h2>
<p>在 Flutter 中嵌入原生 Android 控件(如 WebView、地图)。</p>
<p><strong>示例(嵌入 Android View)</strong></p>
<div class="jb51code"><pre class="brush:java;">// Flutter 侧
Widget build(BuildContext context) {
return AndroidView(
viewType: 'native_view',
creationParams: {'text': 'Flutter传递的参数'},
creationParamsCodec: StandardMessageCodec(),
);
}
</pre></div>
<div class="jb51code"><pre class="brush:java;">// Android 侧注册视图
class NativeViewFactory : PlatformViewFactory(StandardMessageCodec.INSTANCE) {
override fun create(context: Context, id: Int, args: Any?): PlatformView {
val params = args as Map<String, Any>
return NativeView(context, params["text"] as String)
}
}
// 在 FlutterActivity 中注册
flutterEngine.platformViewsController.registry.registerViewFactory(
"native_view", NativeViewFactory()
)
</pre></div>
<p class="maodian"></p><h2>4. 直接调用原生 Activity/Service</h2>
<p>从 Flutter 启动 Android 原生页面或服务。</p>
<p><strong>示例:</strong></p>
<div class="jb51code"><pre class="brush:java;">// Flutter 侧
const channel = MethodChannel('com.example/activity');
Future<void> startNativeActivity() async {
await channel.invokeMethod('startVideoPlayer', {'url': 'video.mp4'});
}
</pre></div>
<div class="jb51code"><pre class="brush:java;">// Android 侧
MethodChannel(flutterEngine.dartExecutor, "com.example/activity").setMethodCallHandler { call, result ->
if (call.method == "startVideoPlayer") {
val url = call.argument<String>("url")
val intent = Intent(this, VideoPlayerActivity::class.java).apply {
putExtra("videoUrl", url)
}
startActivity(intent)
result.success(null)
}
}
</pre></div>
<p class="maodian"></p><h2>5. 数据共享</h2>
<p>通过共享存储(如 SharedPreferences、数据库)传递数据。</p>
<p><strong>示例(SharedPreferences):</strong></p>
<div class="jb51code"><pre class="brush:java;">// Flutter 侧
final prefs = await SharedPreferences.getInstance();
await prefs.setString('token', 'abc123');
</pre></div>
<div class="jb51code"><pre class="brush:java;">// Android 侧读取(同一文件)
val prefs = getSharedPreferences("FlutterSharedPreferences", MODE_PRIVATE)
val token = prefs.getString("flutter.token", "") // 注意键名前缀 `flutter.`
</pre></div>
<p class="maodian"></p><h2>6. FFI(Foreign Function Interface)</h2>
<p>直接调用 C/C++ 代码(通过 <code>dart:ffi</code>),适用于高性能计算或底层操作。</p>
<p><strong>适用场景:</strong></p>
<ul><li>调用现有的 C/C++ 库。</li><li>需要极致性能的模块(如图像处理)。</li></ul>
<p class="maodian"></p><h2>如何选择</h2>
<table><thead><tr><th>场景</th><th>推荐方式</th></tr></thead><tbody><tr><td>简单方法调用</td><td>MethodChannel</td></tr><tr><td>持续事件监听(如传感器)</td><td>EventChannel</td></tr><tr><td>复用社区功能(如相机)</td><td>Plugins</td></tr><tr><td>嵌入复杂原生控件</td><td>Platform Views</td></tr><tr><td>启动原生页面</td><td>调用 Activity/Service</td></tr><tr><td>共享简单数据</td><td>SharedPreferences</td></tr><tr><td>高性能原生代码交互</td><td>FFI</td></tr></tbody></table>
<p class="maodian"></p><h2>注意事项</h2>
<ul><li><strong>线程问题</strong>:原生代码默认在 UI 线程执行,耗时操作需切换到子线程。</li><li><strong>异步处理</strong>:Flutter 侧使用 <code>Future</code>,原生侧需调用 <code>result.success()</code> 或 <code>result.error()</code>。</li><li><strong>性能</strong>:频繁跨平台通信可能影响性能,尽量批量传递数据。</li></ul>
<p>通过合理选择这些方式,可以无缝结合 Flutter 的跨平台优势与 Android 的原生能力。</p>
<p>到此这篇关于Flutter与Android互通的常用方式实现与适用场景详解的文章就介绍到这了,更多相关Flutter与Android互通内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>Flutter TV Android端开发技巧详细教程</li><li>Android开发组件flutter的20个常用技巧示例总结</li><li>Android开发中Flutter组件实用技巧</li><li>Android集成Flutter</li><li>Flutter 和 Android 互相传递数据的实现</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]