Flutter与Android互通的常用方式实现与适用场景详解

 更新时间:2025年07月11日 10:06:58   作者:小李飞飞砖  
Flutter 与 Android 的互通主要通过几种常见方式实现,每种方式适用于不同的场景,下面小编就来和大家详细介绍一下,需要的小伙伴可以了解下

Flutter 与 Android 的互通主要通过以下几种方式实现,每种方式适用于不同的场景:

1. 平台通道(Platform Channels)

Flutter 与原生 Android 代码通信的核心方式,支持双向调用。

类型

  • MethodChannel:双向方法调用(最常用)
  • EventChannel:用于原生向 Flutter 发送事件流(如传感器数据)
  • BasicMessageChannel:简单的消息传递(较少使用)

示例(MethodChannel)

// 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}');
  }
}
// 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()
            }
        }
    }
}

2. 插件(Plugins)

封装原生功能的可复用模块,社区或官方提供(如相机、定位等)。

使用步骤

添加依赖pubspec.yaml):

dependencies:
  url_launcher: ^6.0.0

调用插件

import 'package:url_launcher/url_launcher.dart';
Future<void> launchURL() async {
  if (await canLaunch('https://flutter.dev')) {
    await launch('https://flutter.dev');
  }
}

自定义插件

通过 flutter create --template=plugin 生成插件模板,自动生成平台通道代码。

3. 平台视图(Platform Views)

在 Flutter 中嵌入原生 Android 控件(如 WebView、地图)。

示例(嵌入 Android View)

// Flutter 侧
Widget build(BuildContext context) {
  return AndroidView(
    viewType: 'native_view',
    creationParams: {'text': 'Flutter传递的参数'},
    creationParamsCodec: StandardMessageCodec(),
  );
}
// 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()
)

4. 直接调用原生 Activity/Service

从 Flutter 启动 Android 原生页面或服务。

示例:

// Flutter 侧
const channel = MethodChannel('com.example/activity');
Future<void> startNativeActivity() async {
  await channel.invokeMethod('startVideoPlayer', {'url': 'video.mp4'});
}
// 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)
    }
}

5. 数据共享

通过共享存储(如 SharedPreferences、数据库)传递数据。

示例(SharedPreferences):

// Flutter 侧
final prefs = await SharedPreferences.getInstance();
await prefs.setString('token', 'abc123');
// Android 侧读取(同一文件)
val prefs = getSharedPreferences("FlutterSharedPreferences", MODE_PRIVATE)
val token = prefs.getString("flutter.token", "") // 注意键名前缀 `flutter.`

6. FFI(Foreign Function Interface)

直接调用 C/C++ 代码(通过 dart:ffi),适用于高性能计算或底层操作。

适用场景:

  • 调用现有的 C/C++ 库。
  • 需要极致性能的模块(如图像处理)。

如何选择

场景推荐方式
简单方法调用MethodChannel
持续事件监听(如传感器)EventChannel
复用社区功能(如相机)Plugins
嵌入复杂原生控件Platform Views
启动原生页面调用 Activity/Service
共享简单数据SharedPreferences
高性能原生代码交互FFI

注意事项

  • 线程问题:原生代码默认在 UI 线程执行,耗时操作需切换到子线程。
  • 异步处理:Flutter 侧使用 Future,原生侧需调用 result.success()result.error()
  • 性能:频繁跨平台通信可能影响性能,尽量批量传递数据。

通过合理选择这些方式,可以无缝结合 Flutter 的跨平台优势与 Android 的原生能力。

到此这篇关于Flutter与Android互通的常用方式实现与适用场景详解的文章就介绍到这了,更多相关Flutter与Android互通内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决EditText、ListView以及GridView同时使用,输入法自动跳出来的方法

    解决EditText、ListView以及GridView同时使用,输入法自动跳出来的方法

    本篇文章是对在Android中EditText、ListView以及GridView同时使用,输入法自动跳出来的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Android提高之AudioRecord实现助听器的方法

    Android提高之AudioRecord实现助听器的方法

    这篇文章主要介绍了Android中AudioRecord实现助听器的方法,对进行Android项目开发有一定的借鉴价值,需要的朋友可以参考下
    2014-08-08
  • Android实现多级列表中的新建功能

    Android实现多级列表中的新建功能

    这篇文章主要为大家详细介绍了Android实现多级列表中的新建功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Android使用GridView实现日历的方法

    Android使用GridView实现日历的方法

    本篇文章主要介绍了Android使用GridView实现日历的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Android权限机制带来的一些安全问题介绍

    Android权限机制带来的一些安全问题介绍

    这篇文章主要介绍了Android权限机制带来的一些安全问题介绍,本文讲解了权限机制的缺陷和不足、树立权限意识、越过权限机制等内容,需要的朋友可以参考下
    2015-04-04
  • Android中关于定时任务实现关闭订单问题

    Android中关于定时任务实现关闭订单问题

    在电商、支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝、某东都有这样的逻辑,而且时间很准确,误差在1s内;那他们是怎么实现的呢?今天通过本文学习定时任务实现关闭订单问题
    2022-05-05
  • Android简单实现无限滚动自动滚动的ViewPager

    Android简单实现无限滚动自动滚动的ViewPager

    这篇文章主要介绍了Android简单实现无限滚动自动滚动的ViewPager,百度谷歌上面也有很多关于这方面的教程,但是感觉都略显麻烦,而且封装的都不是很彻底。所以试着封装一个比较好用的ViewPager,实现思路一起通过本文学习吧
    2016-12-12
  • Android高仿IOS 滚轮选择控件

    Android高仿IOS 滚轮选择控件

    这篇文章主要为大家详细介绍了Android 高仿IOS滚轮选择控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android实现图片浏览功能的示例详解(附带源码)

    Android实现图片浏览功能的示例详解(附带源码)

    在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-09-09
  • Android学习之Span的使用方法详解

    Android学习之Span的使用方法详解

    这篇文章主要为大家详细介绍了Android中各种Span类的使用方法,文中的示例代码讲解详细,对我们学习Android有一定的帮助,需要的可以参考一下
    2022-06-06

最新评论