基于Flutter开发原生可调用SDK的技术咨询
Flutter 原生可调用 SDK 开发解决方案
1. 选择合适的项目类型
直接选 Flutter Module,原因如下:
- Flutter Module 专为嵌入原生项目设计,可直接打包成 Android 端的
.aar和 iOS 端的.framework,完全匹配你输出 SDK 的需求。 - Flutter Plugin 核心是封装单一能力(原生供 Flutter 调用/Flutter 供原生调用),不适合包含完整 Flutter UI 页面的 SDK 开发。
- FFI Plugin 用于 Flutter 调用 C/C++ 底层逻辑,仅适用于无 UI 的性能敏感场景,不满足你启动 Flutter 页面的需求。
2. Flutter SDK 内请求 Token + 原生启动 Flutter 页面
请求 Token 的两种方案
- Flutter 侧自主请求:在 Flutter 初始化逻辑(如
main函数或专门的 SDK 初始化类)中,用网络库(如dio)发起请求获取 Token,存储到内存或本地缓存(如shared_preferences)。示例代码:import 'package:dio/dio.dart'; Future<String> fetchToken() async { final response = await Dio().post('https://your-token-api.com', data: {'param': 'value'}); final token = response.data['token']; // 存储token到本地或内存 return token; } - 原生传递 Token 给 Flutter:若宿主应用已持有 Token,通过
MethodChannel传递给 Flutter。Flutter 侧监听示例:final MethodChannel _channel = MethodChannel('com.your.sdk/token'); void initTokenListener() { _channel.setMethodCallHandler((call) async { if (call.method == 'setToken') { String token = call.arguments as String; // 保存token } }); }
原生启动 Flutter 页面
- Android 端:初始化
FlutterEngine,指定初始路由启动页面:// 建议全局单例初始化FlutterEngine val flutterEngine = FlutterEngine(context) flutterEngine.dartExecutor.executeDartEntrypoint( DartExecutor.DartEntrypoint.createDefault() ) // 启动指定路由的Flutter页面 startActivity( FlutterActivity.withNewEngine() .initialRoute("/target_page") // 对应Flutter路由表中的路径 .build(context) ) - iOS 端:初始化
FlutterEngine,通过FlutterViewController加载页面:// 建议全局单例初始化FlutterEngine let flutterEngine = FlutterEngine(name: "your_sdk_engine") flutterEngine.run() // 创建并展示Flutter页面 let flutterVC = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil) flutterVC.setInitialRoute("/target_page") present(flutterVC, animated: true)
3. 宿主应用导入 SDK 并交互
Android 端导入与交互
- 导入 SDK:将生成的
.aar文件放到宿主项目的libs目录,在app/build.gradle中添加依赖:dependencies { implementation files('libs/your_flutter_sdk.aar') // 需添加Flutter核心依赖 implementation "io.flutter:flutter_embedding_release:1.0.0" } - 交互方式:通过
MethodChannel实现双向调用,比如原生触发 SDK 初始化、传递参数,或 Flutter 调用原生能力:val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.your.sdk/interaction") // 原生调用Flutter方法 channel.invokeMethod("initSdk", mapOf("appKey" to "your_host_app_key")) // 监听Flutter调用原生 channel.setMethodCallHandler { call, result -> if (call.method == "getHostAppInfo") { result.success("Host App Version: 1.0.0") } }
iOS 端导入与交互
- 导入 SDK:将生成的
.framework文件拖入 Xcode 项目,在Build Settings中配置Framework Search Paths,并确保添加到Embedded Binaries。 - 交互方式:通过
FlutterMethodChannel实现双向通信:let channel = FlutterMethodChannel(name: "com.your.sdk/interaction", binaryMessenger: flutterEngine.binaryMessenger) // 原生调用Flutter方法 channel.invokeMethod("initSdk", arguments: ["appKey": "your_host_app_key"]) // 监听Flutter调用原生 channel.setMethodCallHandler { call, result in if call.method == "getHostAppInfo" { result.success("Host App Version: 1.0.0") } }
内容的提问来源于stack exchange,提问作者Lucas Bordini
相关产品推荐
相关产品推荐

