在上一篇文章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. Vue3开源组件库

    最近收到的很多问题都是关于Vue3组件库的问题 今天就给大家推荐几个基于Vue3重构的开源组件库 目前状态都处于Beta阶段,建议大家抱着学习的心态入场,勿急于用到生产环境 Ant-design-vu ...

  2. Typescript 的数据类型有哪些?

    一.是什么 typescript 和 javascript几乎一样,拥有相同的数据类型,另外在javascript基础上提供了更加实用的类型供开发使用 在开发阶段,可以为明确的变量定义为某种类型,这样 ...

  3. Node 文件查找的优先级以及 Require 方法的文件查找策略

    一.模块规范 NodeJS对CommonJS进行了支持和实现,让我们在开发node的过程中可以方便的进行模块化开发: 在Node中每一个js文件都是一个单独的模块 模块中包括CommonJS规范的核心 ...

  4. 树莓派和esp8266之间使用tcp协议通信

    树莓派代码: from flask import Flask, render_template import socket import threading app = Flask(__name__) ...

  5. 力扣626(MySQL)-换座位(中等)

    题目: 表: Seat 编写SQL查询来交换每两个连续的学生的座位号.如果学生的数量是奇数,则最后一个学生的id不交换. 按 id 升序 返回结果表. 查询结果格式如下所示. 示例1: 解释: 请注意 ...

  6. [Go] flag package 指南: 命令行参数标记的解析

    flag 是 Golang 的官方包. 支持用法有三种,不同之处是二三两种用法是 Var() 函数可以绑定 flag 到一个变量上. 直接调用指定类型的函数有多种,如 flag.String(), B ...

  7. 2019-7-3-Roslyn-理解-msbuild-的清理过程

    title author date CreateTime categories Roslyn 理解 msbuild 的清理过程 lindexi 2019-07-03 18:21:25 +0800 20 ...

  8. Multisim仿真验证之二极管的特性参数

    二极管的特性 正向 R1 10% 20% 30% 50% 70% 90% Vd/mV 299 543 583 608 627 658 Id/mA 0.01 0.1 0.6 1.4 2.8 7.2 rd ...

  9. 【爬虫案例】用Python爬大麦网任意城市的近期演出活动!

    目录 一.爬取目标 二.展示爬取结果 三.讲解代码 四.同步视频 五.附完整源码 一.爬取目标 大家好,我是@马哥python说 ,一枚10年程序猿. 今天分享一期python爬虫案例,爬取目标是大麦 ...

  10. go1.18泛型全部教程

    目录 go1.18泛型全部教程 一 什么是泛型 二 Golang中的泛型 三 泛型语法详解 3.1 泛型的语法 3.2 Constraint(约束)是什么 3.3 自定义constraint(约束) ...