You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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 端导入与交互

  1. 导入 SDK:将生成的 .aar 文件放到宿主项目的 libs 目录,在 app/build.gradle 中添加依赖:
    dependencies {
        implementation files('libs/your_flutter_sdk.aar')
        // 需添加Flutter核心依赖
        implementation "io.flutter:flutter_embedding_release:1.0.0"
    }
    
  2. 交互方式:通过 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 端导入与交互

  1. 导入 SDK:将生成的 .framework 文件拖入 Xcode 项目,在 Build Settings 中配置 Framework Search Paths,并确保添加到 Embedded Binaries。
  2. 交互方式:通过 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:25:15