Flutter:Android/iOS集成Flutter模块

这篇具有很好参考价值的文章主要介绍了Flutter:Android/iOS集成Flutter模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Android工程集成Flutter模块工程:

1.使用命令创建Flutter模块工程lib_flutter(与Android工程属于同级目录):

flutter create -t module --org com.yyh lib_flutter

2.更新Android工程配置:

(1)将Android工程Support V4/V7包替换为AndroidX包,右键点击工程,在弹出菜单中选择 Refactor >  Migrate to AndroidX...,然后在左下角弹出的框中,点击Do Refactor,然后等待自动替换完成:

Flutter:Android/iOS集成Flutter模块

(2)修改compileSdkVersion与targetSdkVersion为31,在Android工程/app/build.gradle中:

android {
    compileSdkVersion 31   //修改为31,否则报错
    buildToolsVersion '30.0.2'
    defaultConfig {
        minSdkVersion 23
        targetSdkVersion 31   //修改为31,否则报错
        //...省略其他配置
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

(3)修改kotlin_version,在Android工程/build.gradle中:

buildscript {
    ext.kotlin_version = '1.6.10'
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    }
}

(4)在AndroidManifest.xml中处理Android12报错问题:

<application tools:node="replace">   <!-- 替换三方库中的相关属性,以此处为准 -->
        <activity android:exported="true">   <!-- 为含<intent-filter>的节点增加android:exported属性(Android12要求) -->
            <intent-filter>...</intent-filter>
        </activity>
        <receiver android:exported="true">
            <intent-filter>...</intent-filter>
        </receiver>
        <service android:exported="true">
            <intent-filter>...</intent-filter>
        </service>
</application>

3.导入Flutter模块:

(1)加载lib_flutter模块工程,在Android工程/settings.gradle中添加:

...  #省略其他配置
setBinding(new Binding([gradle: this]))
evaluate(new File(settingsDir.parentFile, 'lib_flutter/.android/include_flutter.groovy'))
#以下2行Sync后自动产生,无需添加(如果不能生成,则手动添加)
include ':lib_flutter'
project(':lib_flutter').projectDir = new File('../lib_flutter')

(3)添加Flutter依赖,在Android工程/app/build.gradle中:

dependencies {
  //...省略其他配置
  implementation project(':flutter')  //添加Flutter依赖
}

(4)点Sync Project With...同步下,完成后就能在Android Studio中看到lib_flutter模块了。

4.跳转Flutter页面:

(1)AndroidManifest.xml中<application>节点内添加FlutterActivity:

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

(2)跳转Flutter入口首页(冷启动):

startActivity(FlutterActivity.createDefaultIntent(this));

(3)跳转Flutter自定义页:

方式1(冷启动):

startActivity(FlutterActivity.withNewEngine()
                .initialRoute("路由id")  //要跳转的页面路由id,需要在Flutter中注册此路由id
                //.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)  //设置透明背景
                .build(this));

方式2(热启动):

//初始化FlutterEngine
public class AFApplication extends Application {
    public FlutterEngine mFlutterEngine; //预热方式启动的FlutterEngine
    @Override
    public void onCreate() {
        super.onCreate();
        initFlutterEngine();
        ...
    }
    void initFlutterEngine(){//初始化FlutterEngine
        mFlutterEngine = new FlutterEngine(this);
        mFlutterEngine.getNavigationChannel().setInitialRoute("路由id"); //设置初始跳转页路由id,需要在Flutter中注册此路由id
        mFlutterEngine.getDartExecutor().executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());  //开始预热FlutterEngine
        FlutterEngineCache.getInstance().put("engine_id", mFlutterEngine); //缓存engine_id
    }
}
//跳转Flutter指定页(热启动,低延迟)
startActivity(FlutterActivity.withCachedEngine("engine_id")  //使用已缓存的engine_id启动Flutter自定义页
                //.backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent)  //设置透明背景
                .build(this));

5.Flutter Fragment与Flutter View见官方文档:

https://flutter.cn/docs/development/add-to-app/android/add-flutter-fragment

二、iOS工程集成Flutter模块工程:

1.使用命令创建Flutter模块工程lib_flutter(与iOS工程属于同级目录):

flutter create --template module lib_flutter

2.配置iOS工程,在工程/Podfile中添加(完成后执行命令:pod install):

#导入lib_flutter模块工程
flutter_application_path = '../lib_flutter'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')

target 'iOSP_FlutterM' do
  use_frameworks!
  install_all_flutter_pods(flutter_application_path)  #flutter相关
end
#flutter相关
post_install do |installer|
  flutter_post_install(installer) if defined?(flutter_post_install)
end

3.跳转Flutter页面:

(1)方式1(冷启动):

- (void)startFlutterPageByCold{
    //跳转Flutter入口首页
    FlutterViewController *flutterViewController = [[FlutterViewController alloc] initWithProject:nil nibName:nil bundle:nil];
    //跳转Flutter指定页,路由id需要在Flutter中注册
    //FlutterViewController *flutterViewController = [[FlutterViewController alloc] initWithProject:nil initialRoute:@"路由id" nibName:nil bundle:nil];
    [self presentViewController:flutterViewController animated:YES completion:nil];
}

(2)方式2(热启动):

AppDelegate.h:

@import Flutter;
//...省略其他无关的
@interface AppDelegate : FlutterAppDelegate
@property (nonatomic,strong) FlutterEngine *flutterEngine;  //定义FlutterEngine
//...省略其他无关的
@end

AppDelegate.m:

#import "AppDelegate.h"
#import <FlutterPluginRegistrant/GeneratedPluginRegistrant.h>
//...省略其他无关的
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.flutterEngine = [[FlutterEngine alloc] initWithName:@"engine_id"];
    [self.flutterEngine run]; //跳转Flutter入口首页
    //[self.flutterEngine runWithEntrypoint:FlutterDefaultDartEntrypoint initialRoute:@"路由id"];  //跳转Flutter指定页面,路由id需要在Flutter中注册
    [GeneratedPluginRegistrant registerWithRegistry:self.flutterEngine];  //连接插件(仅带有iOS平台的插件时需要)
    return YES;
}
//...省略其他无关的

跳转代码:文章来源地址https://www.toymoban.com/news/detail-459622.html

- (void)startFlutterPageByHot{
    FlutterEngine *flutterEngine = ((AppDelegate *)UIApplication.sharedApplication.delegate).flutterEngine;//获取AppDelegate中的FlutterEngine
    FlutterViewController *flutterViewController = [[FlutterViewController alloc] initWithEngine:flutterEngine nibName:nil bundle:nil];
    [self presentViewController:flutterViewController animated:YES completion:nil];
}

到了这里,关于Flutter:Android/iOS集成Flutter模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter 与原生交互(Android,iOS)

    本质上 Flutter 和 原生通信是通过 Channel 来完成的:Flutter中消息的传递是完全异步的; 消息使用 Channel(平台通道) 在客户端(UI) 和主机(p平台) Flutter 与 native端交互三种方式 1.BasicMessageChannel (用于传递字符串和半结构化信息,持续通信使用,例如dart端将服务器的数据陆续传入到

    2024年02月17日
    浏览(52)
  • 在Android原生项目中 创建 Flutter模块

    应用场景: 在已有的 Android原生项目中,引入Flutter模块,摸索了两天,终于给整出来了; 如果是新项目 ,最好直接创建Flutter项目,然后在Fluter的 android / ios目录中,写原生代码; 本文除了讲解 Android原生如何创建Flutter模块外,还会演示在使用 Gradle 高版本 和 低版本  时可

    2024年01月19日
    浏览(43)
  • flutter产物以aar形式嵌入android原生工程

    以前做的项目中,flutter都是作为module嵌入原生工程中,新公司项目却是以aar形式嵌入android工程,这种优点是原生工程不必配置flutter环境也能跑了,这里记录一下简单步骤。 通过android studio创建一个flutter module,注意不要创建成flutter工程了,因为工程没法打包成aar。 创建完成

    2024年02月07日
    浏览(36)
  • Flutter Android & IOS 获取通讯录联系人列表

    1.在 pubspec.yaml 文件中添加 contacts_service 和 permission_handler 插件的依赖: 2.在你的 Dart 代码中,导入 contacts_service 插件: 3.权限请求: Android 需要在 android/app/src/main/AndroidManifest.xml 文件中添加以下内容: IOS 需要在 ios/Runner/Info.plist 文件中添加以下内容: 在ios系统上如果进行

    2024年02月08日
    浏览(52)
  • 集成 Firebase 后,Flutter IM SDK 在 Android 端不触发回调

    描述 客户已集成 Firebase Messaging,Android 平台 Flutter IM SDK 的不触发任何回调。 分析(根因分析、需求分析) 可能原因是客户构建了一个 FlutterEngine instance,导致 SDK 的 FlutterEngine instance 失效了。 解决方案 找到以下 java 文件 packages/firebase_messaging/firebase_messaging/android/src/main/jav

    2024年02月01日
    浏览(41)
  • 【flutter】使用permission_handler配置android和 iOS的权限

    flutter在pub.flutter-io.cn插件库中有很多的关于权限配置的插件,但是就我个人而言,比较推荐使用permission_handler这个插件。当我们打开permission_handler时候,往往新手小白会因为它的官网文档而弄的一头雾水,权限配置往往涉及到android和ios两个方向的相关知识,有可能大多数人就

    2024年02月12日
    浏览(43)
  • Flutter视频播放器在iOS端和Android端都能实现全屏播放

    Flutter开发过程中,对于视频播放的三方组件有很多,在Android端适配都挺好,但是在适配iPhone手机的时候,如果设置了 UIInterfaceOrientationLandscapeLeft 和 UIInterfaceOrientationLandscapeRight 都为false的情况下,无法做到全屏播放,因为FLutter的 SystemChrome.setPreferredOrientations 方法不适配iOS端

    2024年02月05日
    浏览(47)
  • uniapp Android 调用5+plus 的IO模块 操作文件管理

    由于最近uniapp项目需要调5+puls,来操作手机文件增删改查,于是入坑了native.jsandroidIO,官网文档先献上 5+puls官网文档 首先介绍一下,我们存储空间有2种模式那就是 沙盒模式 和系统公共目录 我们这里用到的是沙盒模式,app的应用根目录以内存储空间(不需要授权也能访问,默

    2023年04月20日
    浏览(35)
  • 【机器人系统集成备赛记录】IRB-120 ABB机器人扩展IO模块配置(d652和Devicenet Generic Device)

    因明年参加机器人系统集成比赛,所以记录一下。本人水平有限,敬请批评指正。 打开示教器控制面板→配置→Devicenet Device(扩展设备)→点击“添加”进入IO板参数配置。 点击模板↓,选中模板d652。 Address(地址)修改为10 vendor ID(供应商标识)修改为75 product code(产品

    2024年04月22日
    浏览(94)
  • Flutter iOS 与 flutter 相互通信

    在混合开发中避免不了通信,简单记录一下,Flutter iOS工程与Flutter 之间相互通信。 Flutter 中通过Platform Channel实现Flutter和原生端的数据传递,是怎么进行数据通信,以及怎么配置,下面一一进行详解。 通过Platform channel 将传递的数据以发送消息的形式。 跨线程发送到iOS端和

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包