Flutter 混合开发

article/2025/10/8 18:22:09

在Flutter 开发中混合的形式主要有两种

  • 作为独立的页面 进行维护
  • 可以相互嵌套

 

 原生集成 Flutte 混合开发的步骤

  1. 创建 Flutter module
  2. 添加 Flutter module 依赖(为原生项目添加 Flutter 依赖)
  3. 在 Java/Object-c 中调用 Flutter module
  4. 编写 Dart 代码

➠ 运行项目

➠ 热重启 / 热加载

➠ 调试代码

➠ 发布应用

Android:

1. 创建 Flutter module 

首先你得有 原生 android 工程; 路径如下:D:\MineGit\flutter_trip\native_peoject

 首先切换到 原生工程的上一级目录;并且 创建一个flutter模块


C:\Users\user>D:
C:\Users\user>cd D:\MineGit\flutter_trip\native_peoject
D:\MineGit\flutter_trip\native_peoject>cd..
D:\MineGit\flutter_trip>flutter create -t module flutter_module_john

  像这样 flutter  模块就建好了

文件结构如下

 上面就是 flutter_module_john 模块中的文件结构; 你会发现它里面包含 .android 与 .ios,这两个文件夹是 隐藏文件夹(mac 中你必须打开隐藏开关 才能看到文件夹),也是 flutter_module_john 宿主工程

  • .android            -> flutter_module_john模块  的Android 宿主工程
  • .ios                    -> flutter_module_john模块 的 IOS 宿主工程
  • lib                      -> flutter_module_john模块 的 Dart 部分的代码
  • pubspec.yaml   -> flutter_module_john模块 项目依赖配置文件

因为宿主工程的存在, 我们这个 flutter_module 在补额外配置的情况下是 可以独立运行, 通过安装了 Flutter 与 Dart 插件的 AndroidStudio 打开这个 Flutter_module 项目,通过运行按钮就能直接运行它

能顺利运行到手机上面 就说明这个模块 创建的没问题

2. 添加 Flutter module 依赖

这里我们将 刚刚创建的 Flutter_module 加入到 Android 原生工程中:

1. settings.gradle 首先我们修改项目

setBinding(new Binding([gradle:this]))
evaluate(new File(settingsDir.parentFile,'flutter_module_john/.android/include_flutter.groovy'
))

就是把 flutter_module 模块添加到 项目中;注意项目路径的写法;得写成你自己的路径;

下面截图中的两行 是编辑器自己给我添加的 可以移除

 检查下 minSdkVersion 版本最低 16(flutter 支持的最低版本)

2.  build.gradle (app)

添加工程依赖

3. 在 Java 中调用 Flutter module

在 Java 中调用 Flutter 模块的两种方式:

  1. 使用 Flutter.createView  API 方式创建 (作为页面的一部分
    Flutter.createView() 已经被官方弃用 Flutter 1.12版本废弃了io.flutter.facade包导致的;这里使用 FlutterFragment 来创建 FlutterFragment.createDefault();
    public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.test).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//没有指定路由 传值;只能调到 默认路由(开始界面)
    //        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    //        fragmentTransaction.add(R.id.someContainer, FlutterFragment.createDefault());
    //        //fragmentTransaction.replace(R.id.someContainer, FlutterFragment.createDefault());
    //        fragmentTransaction.commit();//指定路由并且传值FlutterFragment flutterFragment = FlutterFragment.withNewEngine().initialRoute("{name:'devio',dataList:['aa','bb','bb']}").build();getSupportFragmentManager().beginTransaction().replace(R.id.someContainer, flutterFragment).commit();}
    });}
    }

    原生传值可以直接 接收到参数:

    import 'dart:ui' as ui;
    final String initParams = ui.window.defaultRouteName;

            编辑的时候:编辑原生原生代码只能修改原生的代码;编辑dart 代码; Flutter_module lib 文件夹里面的代码;直接运行 Flutter_module;只能运行 Flutter_module里面的工程;

4. 热重启 /重启加载

大家知道我们在做 Flutter 开发的时候,它自带热 重启/重新加载的功能, 但是你可以能会发现;在混合开发中 Android 项目集成 Flutter 项目的时候 重启/重新加载不起作用了;那在混合开发中怎么启用 重启/重新加载:

  1. 手机连接我们的 电脑
  2. 关闭我们的应用;然后 运行 flutter attach;(在对应的 flutter_module 项目根路径)
  3. 当出现 “Waiting for a connection from Flutter on PACM00... 的时候打开我们原生App;并且进入我们的 Flutter 界面

    然后会提示同步信息和 命令信息 (因为我有两个手机连接电脑;这里会有一个选择手机的步骤)

    D:\MineGit\flutter_trip\flutter_module_john>flutter attach
    Multiple devices found:
    SM G9650 (mobile) • 21a9f15c1d037ece • android-arm64 • Android 10 (API 29)
    PACM00 (mobile)   • JZU8PB9DQOG68D6D • android-arm64 • Android 10 (API 29)
    [1]: SM G9650 (21a9f15c1d037ece)
    [2]: PACM00 (JZU8PB9DQOG68D6D)
    Please choose one (To quit, press "q/Q"): 2
    Waiting for a connection from Flutter on PACM00...
    Syncing files to device PACM00...                                   7.4sFlutter run key commands.
    r Hot reload.
    R Hot restart.
    h Repeat this help message.
    d Detach (terminate "flutter run" but leave application running).
    c Clear the screen
    q Quit (terminate the application on the device).Running with sound null safety 
    

     现在你只要 修改完毕 dart 代码保存;然后在 按 r 键就能立马看到效果了

5. 调试 dart 代码

在混合开发模式下, 如何更好的调试我们的代码:

  1. 关闭App(这一步很关键)
  2. 点击 AndroidStudio 的 Flutter Attch 按钮(前提是 安装过flutter 与 dart 插件)
  3. 启动App

打上断点  就能进入 对应的断点 了

6. 发布应用 配置好证书

    signingConfigs {//添加release {storeFile file(MYAPP_RELEASE_KEY_FILE)storePassword MYAPP_RELEASE_STORE_PASSWORDkeyAlias MYAPP_RELEASE_KEY_ALIASkeyPassword MYAPP_RELEASE_KEY_PASSWORD}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'signingConfig signingConfigs.release//添加}}

直接运行命令:

>gradlew assembleRelease

或者:

打出来的APK 有:

 在这里可以设置:armeabi-v7a

  指定 APK 只支持32位 类型 减小包体

plugins {id 'com.android.application'
}android {compileSdkVersion 30buildToolsVersion "30.0.3"defaultConfig {applicationId "com.john.nativetoflutter"minSdkVersion 16targetSdkVersion 30versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"ndk {abiFilters 'armeabi-v7a'
//            abiFilters "armeabi", "armeabi-v7a", "x86_64", "x86"}}signingConfigs {//添加release {storeFile file(MYAPP_RELEASE_KEY_FILE)storePassword MYAPP_RELEASE_STORE_PASSWORDkeyAlias MYAPP_RELEASE_KEY_ALIASkeyPassword MYAPP_RELEASE_KEY_PASSWORD}}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'signingConfig signingConfigs.release//添加}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}dependencies {implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'com.google.android.material:material:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'testImplementation 'junit:junit:4.+'androidTestImplementation 'androidx.test.ext:junit:1.1.1'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'implementation project(':flutter')
}

IOS: 原生嵌入 Flutter

  1. 首先你得有原生工程
  2. 你的 Mac 正确配置 Flutter 所需要的环境tt
  3. 你得有 Flutter_Module 工程;我是直接使用上面 android 功能已经创建好的;
  4. 因为 Flutter 有依赖  pod 管理插件;

Pod:  Podfile

# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'flutter_application_path = '../flutter_module_john'  
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')target 'native_project_ios' do# Comment the next line if you don't want to use dynamic frameworksinstall_all_flutter_pods(flutter_application_path)# Pods for native_project_iostarget 'native_project_iosTests' doinherit! :search_paths# Pods for testingåendtarget 'native_project_iosUITests' do# Pods for testingendend

 Flutter Module 里面的 .ios  和 .android 是一个隐藏文件夹; mac 上面想要看见隐藏文件夹;shift + commond+ .

这里自己 根据自己的目录进行配置就可以了;然后写一个按钮 实现跳转 传值:

#import <Flutter/Flutter.h>
///- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.UIButton *button =[UIButton buttonWithType:UIButtonTypeCustom];[button addTarget:self action:@selector(handleButtonAction) forControlEvents:UIControlEventTouchUpInside];[button setTitle:@"Flutter " forState:UIControlStateNormal];[button setBackgroundColor:[UIColor redColor]];button.frame = CGRectMake(80, 210, 160, 40);[self.view addSubview:button];
}
- (void)handleButtonAction{FlutterViewController *flutterviewController =[FlutterViewController new];[flutterviewController setInitialRoute:@"{name:'devio',dataList:['aa','bb','bb']}"];[self presentViewController:flutterviewController animated:true completion:nil];
}


http://chatgpt.dhexx.cn/article/kXlYW0vu.shtml

相关文章

谈谈App混合开发

混合开发的App&#xff08;Hybrid App&#xff09;就是在一个App中内嵌一个轻量级的浏览器&#xff0c;一部分原生的功能改为Html 5来开发&#xff0c;这部分功能不仅能够在不升级App的情况下动态更新&#xff0c;而且可以在Android或iOS的App上同时运行&#xff0c;让用户的体…

原生开发、H5开发与混合开发的区别

文章目录 前言三种方式分别的优缺点原生开发Web APP (HTML5&#xff09;开发混合&#xff08;原生H5&#xff09;开发 三种方式对比 前言 移动应用开发的方式&#xff0c;目前主要有三种&#xff1a; Native App&#xff1a; 本地应用程序&#xff08;原生App&#xff09; Web…

Android Hybrid混合开发

关于混合开发常问道的问题&#xff1a; Android如何嵌套h5页面&#xff1f;h5页面如何调用Android接口&#xff1f;Android如何调用网页&#xff08;js&#xff09;方法?h5页面 判断 移动端是ios、或者Android 问题1.android如何嵌套h5页面&#xff1a; 当我们用vue开发完项…

混合开发(Hybrid App)有哪些优劣点?

从当前移动开发的实际情况来看&#xff0c;移动端的开发方式三分天下&#xff1a;纯原生&#xff08;Native App&#xff09;、混合开发&#xff08;Hybird App&#xff09;、网页应用&#xff08;Web App&#xff09;。 那么&#xff0c;混合式开发与其他的两种开发模式相比&…

原生开发、H5开发和混合开发的区别

目前市场上主流的APP分为三种&#xff1a;原生APP、Web APP&#xff08;即HTML5&#xff09;和混合APP三种&#xff0c;相对应的定 制开发就是原生开发、H5开发和混合开发。那么这三种开发模式究竟有何不同呢&#xff1f;下面我们就分别从这三者各自的优劣势来区分比较吧&#…

混合开发

一、原生语言&#xff1a; 苹果手机&#xff1a;ios系统&#xff0c;由swift和c/object-c语言编写&#xff0c;后缀名为 ipa&#xff08;ios开发的安装包的后缀名&#xff09; swift语言是一种开源的语言 安卓手机&#xff1a;android系统&#xff0c;由java&#xff08;andr…

Android : 混合开发整理指南

混合开发&#xff1a; 是一种开发模式Hybrid App. 混合开发 Native Web. 另一篇博文&#xff1a;Kotlin与H5通信 场景应用&#xff1a; 例如: 微信公众号通过JSSDK连接Native端和Web端 微信小程序通过内置框架连接Native端和Web端 混合开发的核心技术&#xff1a; JS…

Hybrid APP混合开发的一些经验和总结

Hybrid APP混合开发的一些经验和总结 写在前面&#xff1a; 由于业务需要&#xff0c;接触到一个Hybrid APP混合开发的项目。当时是第一次接触混合开发&#xff0c;有一些经验和总结&#xff0c;欢迎各位一起交流学习~ 1、混合开发概述 Hybrid App主要以JSNative两者相互调用为…

【Python编程入门】引言

What is Python? Python 是由 Guido van Rossum 工程师于1991年所开发&#xff0c;是一种高级的、解释性的、交互式的通用型编程语言。它被设计成具有高度可读性&#xff0c;是一门动态编程语言&#xff0c;并且具备自动垃圾回收机制。Python支持多种编程范式&#xff0c;其中…

python编程入门到实践pdf,python编程入门课 视频

初学者学Python编程如何快速入门? 谷歌人工智能写作项目&#xff1a;小发猫 初学python入门都需要具备那些条件&#xff1f; Python相对比较简单&#xff0c;零基础也能学typescript在npm安装后检测不到。系统学习的话&#xff0c;一般4-6个月左右能学好。python是一门语法优…

Python编程:从入门到实践(基础知识)

第一章 起步 计算机执行源程序的两种方式&#xff1a; 编译&#xff1a;一次性执行源代码&#xff0c;生成目标代码解释&#xff1a;随时需要执行源代码 源代码&#xff1a;采用某种编程语言编写的计算机程序 目标代码&#xff1a;计算机可执行&#xff0c;101010 编程语言…

Python从入门到实践电子书,python编程入门到实践pdf

《Python编程从入门到实践》txt下载在线阅读&#xff0c;求百度网盘云资源 《Python编程》&#xff08;[美]埃里克马瑟斯&#xff08;Eric Matthes&#xff09;&#xff09;电子书网盘下载免费在线阅读资源链接&#xff1a;链接&#xff1a; 提取码&#xff1a;6vcz 书名&a…

《我的世界》Python编程入门(1)Minecraft(我的世界)Python编程环境搭建

一、Minecraft环境搭建&#xff08;手动模式&#xff09; 环境搭建分为三个部分&#xff1a; 1.1、Java环境 Minecraft原始版本是用Java开发的&#xff0c;因此&#xff0c;想运行Minecraft需要安装jdk。安装Java jdk8相对来说兼容性比较好。 &#xff08;1&#xff09;安装…

Python编程

1.华氏温度到摄氏温度的转换 从键盘读取华氏温度&#xff0c;转换成摄氏温度并输出&#xff0c;保留1位小数。 转换公式为&#xff1a;c5/9*(f-32), 其中&#xff0c;f为华为温度&#xff0c;c为摄氏温度。 输入格式: 华氏温度 输出格式: 摄低温度 输入样例: 100 结尾无…

Python编程自学入门学习指南

对于初学者来说&#xff0c;入门很重要&#xff0c;这关系到初学者是从入门到精通还是从入门到放弃。 以下是结合Python的学习经验整理出来的学习路径&#xff0c;主要有四个阶段。 NO.1新手入门阶段&#xff0c;学习基础知识。 一般来说&#xff0c;找一本可靠的书&#x…

python编程入门(适合初学者)

python编程入门 特别说明&#xff1a;这是早期的学习笔记&#xff0c;最近试用Python 3.8.1&#xff08; Dec. 18, 2019&#xff09;&#xff0c;发现安装过程及基本功能差不多。或许对新手还有点用处&#xff0c;就未作大修改发布于此。 IDLE是开发python程序的基本IDE&#x…

python编程入门自学

作为一个什么都不懂的小白&#xff0c;学习编程的第一步当然是掌握一门编程语言。本节就来介绍常见的编程语言的学习路线。 首先&#xff0c;先明确一个观点&#xff0c;作为一个程序员&#xff0c;只会一种编程语言是远远不够的。最好精通1~2门语言&#xff0c;基本掌握其它所…

Python编程 介绍(入门)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 一.pytnon安装地址 二.python介绍 1.Python来源 2.Python LOGO&#xff08;蟒…

编程语言python入门-Python基础教程,Python入门教程(非常详细)

Python 英文本意为"蟒蛇”&#xff0c;直到 1989 年荷兰人 Guido van Rossum &#xff08;简称 Guido&#xff09;发明了一种面向对象的解释型编程语言&#xff08;后续会介绍&#xff09;&#xff0c;并将其命名为 Python&#xff0c;才赋予了它表示一门编程语言的含义。…

Python编程入门教程

http://www.tzcoder.cn/acmhome/news.do?methodnewsDetail&id2c903bb4796f8da101798391db600b2e 本博客原文地址&#xff1a;Python编程入门教程(以在线评测平台为载体) - 暴力都不会的蒟蒻 - 博客园&#xff0c;原文体验更佳 如果你是一名浙江2020级及以后的高中生要学…