在上一篇文章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. HDC2021技术分论坛:分布式调试、调优能力解决方案

    作者:yangjianwei 华为高级工程师 HarmonyOS致力于提供1+8+N智慧全场景解决方案,打造设备流转.多端协同的分布式体验,实现一次开发.多端部署,让分布式应用的开发更加简单. 针对分 ...

  2. DevEco Device Tool 3.1 Beta1版本发布,产品化配置优化添加自定义烧录器

    原文:https://mp.weixin.qq.com/s/lVENZqc-1getmkoSgCJiEg,点击链接查看更多技术内容.   HUAWEI DevEco Device Tool(以下内容简 ...

  3. docker 应用篇————docker 自定义网络[十八]

    前言 看下如何自定义网络. 正文 在了解自定义网络之前呢? 需要明白一件事. 就是其实我们在启动docker的时候是有默认参数的. docker run -d -p --name tomcat01 - ...

  4. 我在阿里巴巴做 Serverless 云研发平台

    简介: Serverless 云研发平台经过这半年多的蜕变,已经从简单的解决工程链路的平台演进成一个面向研发.上线.运维的全生命周期研发平台,后续要解决的命题会集中在用户低门槛上. 作者 | 林昱(苏 ...

  5. MySQL 深潜 - 一文详解 MySQL Data Dictionary

    ​简介: 在 MySQL 8.0 之前,Server 层和存储引擎(比如 InnoDB)会各自保留一份元数据(schema name, table definition 等),不仅在信息存储上有着重复 ...

  6. [GPT] vue 的 quasar 框架 在 layout 模版中 如何获取 子页面当前使用的 useMeta

      在 Quasar 框架中,用 Vue Router 的 meta 字段来获取子页面当前使用的 useMeta . 首先,您需要在路由配置中设置子页面的 meta 字段.例如: const rout ...

  7. [ELK] Docker 运行 Elastic Stack 支持 TLS 的两种简单方式

    第一种就是 按照官方文档进行配置,指定证书位置开启. Run the Elastic Stack in Docker with TLS enabled. 第二种就是 9200 端口只暴露给本机,127 ...

  8. 记 Win8.1 某应用渲染抛出 OutOfMemoryException 异常及修复方法

    本文记录某个应用在某台 Windows 8.1 x86 系统上,运行时抛出 OutOfMemoryException 异常,启动失败.应用程序能启动,但是在第一次碰到渲染时,就发现渲染初始化失败,从而 ...

  9. ADOBE FORM的一些相关资料

    虽然很多人觉得打印程序的开发很无聊(我也这么想),但在实际工作中,打印算是比较有意义的工作,所以还是值得学习的. 之前翻译过几篇Adobe Form的文章,其中的内容,可以帮助创建一些简单的打印示例, ...

  10. Golang使用正则

    目录 正则在线测试网站 Golang标准库--regexp 相关文章 课程学习地址: 手册地址: dome 正则在线测试网站 https://regex101.com/ Golang标准库--rege ...