在上一篇文章Flutter(六):Flutter_Boost接入现有原生工程(iOS+Android)中介绍了Flutter_Boost的接入方法,这一篇将介绍Flutter自带的接入方法。

新建工程

1.新建工程

  • 1.使用Xcode新建flutter_demo_ios(模拟已有工程)
  • 2.使用AndroidStudio新建flutter_demo_android(模拟已有工程)
  • 3.使用AndroidStudio新建flutter_demo_flutter(新的flutter库工程)

创建过程可以参考上一篇文章Flutter(六):Flutter_Boost接入现有原生工程(iOS+Android),这里就不再展开了。

备注:

1.AndroidSudio需要安装Dart和Flutter插件

2.flutter工程新建时选择Module

2.新建完成

目录结构如下:

Android接入

1.setting.gradle新增

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

2.app下的build.gradle增加依赖

implementation project(':flutter')

然后执行gradle sync

3.跳转代码

AndroidManifest.xml文件中的application标签中增加:

<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize"
/>

跳转代码

startActivity(FlutterActivity.createDefaultIntent(currentActivity))

iOS接入

1.修改pod文件

flutter_application_path = '../flutter_demo_library'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb') target 'flutter_demo_ios' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks! # Pods for flutter_demo_ios
install_all_flutter_pods(flutter_application_path) end post_install do |installer|
flutter_post_install(installer) if defined?(flutter_post_install)
end

执行pod install,podhelper.rb 脚本会把你的 plugins, Flutter.framework,和 App.framework 集成到你的项目中。

2.修改AppDelegate

import UIKit
import Flutter
import FlutterPluginRegistrant @UIApplicationMain
class AppDelegate: FlutterAppDelegate { lazy var flutterEngine = FlutterEngine(name: "my flutter engine") override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
flutterEngine.run()
GeneratedPluginRegistrant.register(with: self.flutterEngine)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
} }

3.修改ViewController中的跳转代码

let flutterEngine = (UIApplication.shared.delegate as! AppDelegate).flutterEngine
let flutterViewController = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil)
self.navigationController?.pushViewController(flutterViewController, animated: true)

ViewController记得还需要import Flutter,至此iOS接入完毕,使用模拟器也可以正常执行。

问题集锦

Android

1、Caused by: org.gradle.api.InvalidUserCodeException: Build was configured to prefer settings repositories over project repositories but repository 'maven' was added by plugin class 'FlutterPlugin'

原因:Android项目和Flutter项目的Gradle配置不一样

解决方案:

1、只是demo的话,把Flutter/.android/根目录下的setting.gradle和build.gradl拷贝到Android/根目录下,替换Android项目自带的

2、如果是老的工程,可以参考Flutter 混合开发组件化与工程化架构

2.解决Flutter 交互页面可见之前会有一个短暂的延迟

原因:每一个 FlutterActivity 默认会创建它自己的 FlutterEngine。每一个 FlutterEngine 会有一个明显的预热时间。这意味着加载一个标准的 FlutterActivity 时,在你的 Flutter 交互页面可见之前会有一个短暂的延迟。

解决方案:想要最小化这个延迟时间,你可以在抵达你的 FlutterActivity 之前,初始化一个 FlutterEngine,然后使用这个已经预热好的 FlutterEngine。

在Application加入代码:

class MyApplication : Application() {
lateinit var flutterEngine : FlutterEngine override fun onCreate() {
super.onCreate() // Instantiate a FlutterEngine.
flutterEngine = FlutterEngine(this) // Start executing Dart code to pre-warm the FlutterEngine.
flutterEngine.dartExecutor.executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
) // Cache the FlutterEngine to be used by FlutterActivity.
FlutterEngineCache
.getInstance()
.put("my_engine_id", flutterEngine)
}
}

跳转代码:

startActivity(FlutterActivity
.withCachedEngine("my_engine_id")
.build(this))

Flutter(七):Flutter混合开发--接入现有原生工程(iOS+Android)的更多相关文章

  1. 封装 React Native 原生组件(iOS / Android)

    封装 React Native 原生组件(iOS / Android) 在 React Native中,有很多种丰富的组件了,例如 ScrollView.FlatList.SectionList.Bu ...

  2. 【Flutter 混合开发】嵌入原生View-Android

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-IOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...

  3. 【Flutter 混合开发】嵌入原生View-iOS

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...

  4. 【Flutter 混合开发】与原生通信-MethodChannel

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...

  5. 【Flutter 混合开发】与原生通信-BasicMessageChannel

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...

  6. 【Flutter 混合开发】与原生通信-EventChannel

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...

  7. 移动web、webApp、混合APP、原生APP、androd H5混合开发 当无网络下,android怎么加载H5界面

    PhoneGap是一个采用HTML,CSS和JavaScript的技术,创建移动跨平台移动应用程序的快速开发平台.它使开发者能够在网页中调用IOS,Android,Palm,Symbian,WP7,W ...

  8. 混合开发Js bridge新秀-DSBridge iOS篇

    这个DSBridge 和我之前开发做的混合开发 用的方式 很相似,所以觉得很是不错,推荐给你大家. DSBridge-IOS:https://github.com/wendux/DSBridge-IO ...

  9. 使用新版本5+SDK创建最简Android原生工程(Android studio)http://ask.dcloud.net.cn/article/13232

    1 使用Android Studio创建一个工程 2 删除原生工程中Java目录下系统默认创建的源代码 3 复制SDK->libs->lib.5plus.base-release.aar文 ...

  10. Flutter踩坑日记:接入现有iOS项目

    之前搞的Flutter版工具链已经弄完了,感兴趣的朋友可以围观下,Android版本dio库(v2.0.14)发送网络请求老是报错,去官方提了issue还没回,于是今天搞一下把Flutter模块接入到 ...

随机推荐

  1. flutter3-macOS桌面端os系统|flutter3.x+window_manager仿mac桌面管理

    原创力作flutter3+getX+window_manager仿Mac桌面系统平台Flutter-MacOS. flutter3_macui基于最新跨端技术flutter3.19+dart3.3+w ...

  2. redis 简单整理——HyperLogLog[十三]

    前言 简单介绍一下HyperLogLog. 正文 HyperLogLog并不是一种新的数据结构(实际类型为字符串类型),而 是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数 ...

  3. MVC 下拉选项实现的几种方式

    主要介绍4种方式 硬编码方式: ViewBag.hard_value = new List<SelectListItem>() { new SelectListItem(){Value=& ...

  4. 力扣1127(MySQL)-用户购买平台(困难)

    题目: 支出表: Spending 这张表记录了用户在一个在线购物网站的支出历史,该在线购物平台同时拥有桌面端('desktop')和手机端('mobile')的应用程序.这张表的主键是 (user_ ...

  5. 混合云K8s容器化应用弹性伸缩实战

    简介: 混合云K8s容器化应用弹性伸缩实战 1. 前提条件 本最佳实践的软件环境要求如下:应用环境:①容器服务ACK基于专有云V3.10.0版本.②公共云云企业网服务CEN.③公共云弹性伸缩组服务ES ...

  6. 【产品动态】解读Dataphin流批一体的实时研发

    ​简介: Dataphin作为一款企业级智能数据构建与管理产品,具备全链路实时研发能力,从2019年开始就支撑可集团天猫双11的实时计算需求,文章将详细介绍Dataphin实时计算的能力. 背景 每当 ...

  7. 实用的 Bash 快捷键

    前端也有需要运维的时候,这时我们不可避免需要登录 Linux 服务器,并在 Bash 终端输入一些命令,当需要对输入的命令进行一些操作时,比如快速移动光标位置或快速删除字符,如果只会用方向键和退格键, ...

  8. SemanticFunction 自然语言函数

    本文将和大家介绍 LLM 的魔法,通过自然语言编程的方式开发 SemanticFunction 函数 大家都知道,编程里面的函数可以是一个完成某个功能的逻辑片段,绝大部分的函数都需要使用人类不友好的编 ...

  9. WPF dotnet 6 开启 PM v2 的 DPI 感知 导致触摸线程访问 UI 属性抛异常

    本文记录一个 WPF 在 dotnet 6 的一个已知问题,且此问题我已修复提交给官方仓库.这是一个只有在 dotnet 6 框架下,非 dotnet 5 也非 .NET Core 3.1 也非 .N ...

  10. VSCode 中安装 esp-idf

    一.准备工具 首先需要安装好 VSCode 软件和 esp-idf 环境. 安装 VSCode VSCode 安装比较简单,我就不赘述了,进入官网下载一键安装即可 VSCode官网:https://c ...