【Android/Flutter】混编 Flutter Module

2024-09-01 23:18
文章标签 android module flutter 混编

本文主要是介绍【Android/Flutter】混编 Flutter Module,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

友情flutterDemo链接
友情Android混编demo链接

开始前必须了解 flutter 的各个工程的含义

  1. Flutter Application: Flutter应用
  2. Flutter Module :Flutter与原生混合开发
  3. Flutter Plugin:Flutter插件
  4. Flutter Package:纯Dart组件

创建 Android 工程

  1. 创建 android 工程 Flutter_Preoject_Module

Flutter_Preoject_Module目录下创建 fluttermodule

  1. 如下命令二选一
  2. 关键命令1 flutter create --androidx -t module {modulename}
  3. 关键命令2 flutter create -t module {modulename}
  4. 创建两个 flutterModule; my_flutterflutter_module

集成到 Android 项目中

  1. 在 android 工程中添加依赖和其它
android {compileOptions {sourceCompatibility 1.8targetCompatibility 1.8}
}
dependencies {implementation project(':flutter') 
}
  1. 在 android 的 AndroidManifest.xml 中注册 activity
<activityandroid:name="io.flutter.embedding.android.FlutterActivity"android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"android:hardwareAccelerated="true"android:theme="@style/AppTheme"android:windowSoftInputMode="adjustResize" /><activity

以下下是我在项目中自定义的 flutter activity 也注册在 AndroidManifest.xml

<activityandroid:name=".MainFlutterActivity"android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"android:hardwareAccelerated="true"android:theme="@style/AppTheme"android:windowSoftInputMode="adjustResize" />
  1. 启动 app, 原生界面跳转到 flutter 界面
val intent = Intent()
intent.setClass(this, MainFlutterActivity::class.java)
startActivity(intent)
  1. 一个简单的启动 原生启动 flutter 模块就做好了…

使用 MethodChannel 和原生交互

  1. MainFlutterActivity 中注册引擎
class MainFlutterActivity: FlutterActivity(), MethodChannel.MethodCallHandler {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)}override fun configureFlutterEngine(flutterEngine: FlutterEngine) {super.configureFlutterEngine(flutterEngine)val channel = GeneratedPluginRegistrant.registerWith(flutterEngine)channel.setMethodCallHandler(this)}
}

GeneratedPluginRegistrant

@Keep
public final class GeneratedPluginRegistrant {static MethodChannel channel;public static MethodChannel registerWith(@NonNull FlutterEngine flutterEngine) {channel = new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), "com.alex.luan/plugin");return channel;}
}
  1. flutter 通过 methodChannel 调用原生方法
 Future<Null> _jumpToNative() async {String result = await jumpPlugin.invokeMethod('oneAct', {"flutter": "flutter hi $_counter"});print(result);
}Future<Null> _jumpToNativeWithValue() async {Map<String, String> map = { "flutter": "这是一条来自flutter的参数" };String result = await jumpPlugin.invokeMethod('twoAct', map);print(result);
}

原生指定跳转到 flutter 页面

  1. MainActivity 中的关键代码; "route"key, 是 flutter 的关键key;
val intent = Intent()
intent.setClass(this, MainFlutterActivity::class.java)
intent.putExtra("route", "demo?{\"id\":112233}")
startActivity(intent)
  1. 入口 flutter 中的代码; 分析routeName 返回加载不同的 Widget
void main() => runApp(new MyApp(window.defaultRouteName));class MyApp extends StatelessWidget {final String _routeName;MyApp(this._routeName) {print("this is default name : $_routeName");}@overrideWidget build(BuildContext context) {return MaterialApp(home: _widgetForRoute(_routeName),);}
}Widget _widgetForRoute(String s) {print("pageName=" + _getPageName(s) + ",ParamJson=" + _getPageParamJsonStr(s));switch (_getPageName(s)) {case "demo0":return new MyHomePage();case "demo":return new MySecondPage();}return MyFirstPage();
}String _getPageName(String s) {if (s.indexOf("?") == -1) {return s;} else {return s.substring(0, s.indexOf("?"));}
}String _getPageParamJsonStr(String s) {if (s.indexOf("?") == -1) {return "{}";} else {return s.substring(s.indexOf("?") + 1);}
}
  1. 加载其它模块的方法需要在 yaml 文件中加如下配置
dev_dependencies:flutter_test:sdk: flutterflutter_module:path: ...../Flutter_Preoject_Module/flutter_module

您的一举一动都是对我的莫大支持

这篇关于【Android/Flutter】混编 Flutter Module的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128326

相关文章

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE