在已有的原生 App 里嵌入 Flutter 页面的方法

devtools/2025/3/4 8:04:40/

在原生 App 中嵌入 Flutter 页面,通常使用 Flutter 提供的**平台通道(Platform Channels)**来实现原生代码与 Flutter 之间的交互。具体实现方式依赖于原生 App 的平台(如 Android 或 iOS),下面是两种常见的方法:

1. 使用 Flutter 插件(Flutter Module)

这种方法通过将 Flutter 作为一个模块嵌入到现有的原生应用中。这样可以让你在现有的原生应用里调用 Flutter 页面。

步骤:
  • 创建 Flutter 模块: 首先,你需要创建一个 Flutter 模块,这样就可以将 Flutter 页面嵌入到现有的原生应用中。

    你可以通过以下命令来创建 Flutter 模块:

    flutter create --template module my_flutter
    

    这样会创建一个 Flutter 模块,目录结构类似:

    my_flutter/
    ├── .ios/
    ├── .android/
    └── lib/
    
  • 将 Flutter 模块添加到现有的原生 App 中:

    • 对于 Android

      1. 在原生项目的 settings.gradle 中包含 Flutter 模块:
      include ':app', ':my_flutter'
      setProjectDir(':my_flutter', file('path_to_flutter_module'))
      
      1. app/build.gradle 中添加对 Flutter 的依赖:
      dependencies {implementation project(':my_flutter')
      }
      
      1. 在原生代码中启动 Flutter 页面:
      import io.flutter.embedding.android.FlutterActivity;// 启动 Flutter 页面
      startActivity(FlutterActivity.createDefaultIntent(this)
      );
      
    • 对于 iOS

      1. 在原生 iOS 项目的 Podfile 中添加 Flutter 模块依赖:
      flutter_application_path = 'path_to_flutter_module'
      load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
      
      1. 在原生代码中启动 Flutter 页面:
      import Flutterlet flutterEngine = FlutterEngine(name: "my flutter engine")
      flutterEngine.run()let flutterViewController = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil)
      self.present(flutterViewController, animated: true, completion: nil)
      

2. 使用 FlutterFragmentFlutterViewController(更细粒度的控制)

如果你想在原生应用中嵌入一个 Flutter 页面而不是整个 Flutter 模块,可以使用 FlutterFragment(Android)或 FlutterViewController(iOS)来嵌入单个 Flutter 页面。

Android:

你可以通过 FlutterFragment 来嵌入 Flutter 页面:

import io.flutter.embedding.android.FlutterFragment;FlutterFragment flutterFragment = FlutterFragment.withNewEngine().build();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, flutterFragment).commit();
iOS:

你可以通过 FlutterViewController 来嵌入 Flutter 页面:

import Flutterlet flutterViewController = FlutterViewController()
self.navigationController?.pushViewController(flutterViewController, animated: true)

3. 使用平台通道与原生代码通信

在嵌入 Flutter 页面后,如果需要在 Flutter 与原生代码之间进行通信,可以使用平台通道(Platform Channels)。这允许你在 Flutter 页面与原生应用之间传递数据和调用方法。

  • Flutter 端:

    import 'package:flutter/services.dart';static const platform = MethodChannel('com.example.myapp/channel');Future<void> _callNative() async {try {final result = await platform.invokeMethod('nativeMethod');print(result);} on PlatformException catch (e) {print("Failed to call native method: '${e.message}'.");}
    }
    
  • Android 端:

    import io.flutter.plugin.common.MethodChannel;
    import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
    import io.flutter.plugin.common.MethodChannel.Result;new MethodChannel(getFlutterEngine().getDartExecutor(), "com.example.myapp/channel").setMethodCallHandler((call, result) -> {if (call.method.equals("nativeMethod")) {result.success("Hello from Android");} else {result.notImplemented();}});
    
  • iOS 端:

    import Flutterlet channel = FlutterMethodChannel(name: "com.example.myapp/channel", binaryMessenger: flutterViewController.binaryMessenger)channel.setMethodCallHandler { (call, result) inif call.method == "nativeMethod" {result("Hello from iOS")} else {result(FlutterMethodNotImplemented)}
    }
    

这样,你就可以在原生 App 中嵌入 Flutter 页面,并与原生功能进行交互了。


http://www.ppmy.cn/devtools/164404.html

相关文章

基于POI的Excel下拉框自动搜索,包括数据验证的单列删除

目录 目标 例子 1.搜索下拉框页 2.数据源页 3.效果 代码以及注意事项 1.代码 2.注意事项 1.基于Excel的话&#xff0c;相当于加入了一个【数据验证】 2.代码中的一些方法说明 目标 期望在Excel利用代码创建具备自动搜索功能的下拉框 例子 1.搜索下拉框页 2.数据源…

macOS 设置屏幕常亮 不休眠

Apple M1 Pro macOS Sonoma设置“永不”防止进入休眠 macOS Sonoma 设置“永不” 防止进入休眠

JAVA最新版本详细安装教程(附安装包)

目录 文章自述 一、JAVA下载 二、JAVA安装 1.首先在D盘创建【java/jdk-23】文件夹 2.把下载的压缩包移动到【jdk-23】文件夹内&#xff0c;右键点击【解压到当前文件夹】 3.如图解压会有【jdk-23.0.1】文件 4.右键桌面此电脑&#xff0c;点击【属性】 5.下滑滚动条&…

【算法系列】经典的堆排序算法

文章目录 堆排序算法什么是堆排序&#xff1f;二叉堆的概念 堆排序的基本步骤堆排序的详细流程构建最大堆维护最大堆排序过程Java代码实现 堆排序的图示步骤1. 初始的数组与堆2. 构建最大堆2.1. 检查节点9&#xff08;序号为3&#xff09;2.2. 检查节点6&#xff08;序号为2&am…

自动驾驶FSD技术的核心算法与软件实现

引言&#xff1a;FSD技术的定义与发展背景 在当今快速发展的科技领域中&#xff0c;自动驾驶技术已经成为全球关注的焦点之一。其中&#xff0c;“FSD”&#xff08;Full Self-Driving&#xff0c;全自动驾驶&#xff09;代表了这一领域的最高目标——让车辆在无需人类干预的情…

kafka stream对比flink

Kafka Streams 和 Apache Flink 虽然都支持实时计算&#xff0c;但它们的定位、架构和适用场景存在显著差异。选择哪一个取决于具体的需求、场景和技术栈。以下是两者的核心区别和适用场景分析&#xff1a; 1. 定位与架构差异 Kafka Streams 定位&#xff1a;轻量级库&#x…

Java高频笔试题01(含答案及解析)

1.属于面向对象的特征的是( )[多选] A.封装 B.重写 C.重载 D.继承 答案:AD 解析:面向对象的四大特征包括封装、继承、多态和抽象。重写和重载是多态的具体实现方式,但不直接作为特征。 2. ArrayList和LinkedList的哪个是需要动态调整容量的( )[单选] A.都不是 B.都是 C. Lin…

虚拟机缩放比例问题处理

上班打开虚拟机的样子。 最开始判断可能是vmtools 异常重启安装后发现没有效果 通过 xrandr 功能查询显示器信息获取显示器名 设置显示器 同时设置分辨率 也可以同时设置刷新率 注意下图中设置的关键字