安卓原生项目中集成flutter moudle

本文分享了作者从一年的Flutter项目经验过渡到在原生应用中嵌入Flutter模块的心得。通过具体代码示例,介绍了如何使用FlutterEngine实现页面跳转,并在Android原生项目中集成Flutter模块。

去年做了一年的flutter 项目,今年新公司接到的任务是在原生项目中嵌入flutter moudle,开始上手有点手生,一步一步踩坑中,话不多说,上代码直接干。

跳转的方式有很多,我用的是FlutterEngine 的方式:

原生项目中 New -->> moudle -->> flutter moudle 

创建完成再 import moudle

首先安卓原生正常创建一个Activity

class PadFlutterActivity : AppCompatActivity(),FlutterUiDisplayListener{

    val FLUTTER_ROUTE_NAME = "flutter_route_name"

    var mFlutterEngine: FlutterEngine? = null
    var mFlutterView: FlutterView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_catering)
        val flutterRoute = intent.getStringExtra(FLUTTER_ROUTE_NAME)
        mFlutterEngine = FlutterEngineCache.getInstance().get(App.KEY_FLUTTER_CATERING);
        mFlutterEngine!!.navigationChannel.setInitialRoute(flutterRoute)
        mFlutterView = createFlutterView()
        mFlutterView!!.attachToFlutterEngine(mFlutterEngine!!);

    }

    private fun createFlutterView(): FlutterView? {
        var flutterView = FlutterView(this)
        var layoutParams = FrameLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT
        )
        fl_flutter.addView(flutterView, layoutParams)

        return flutterView
    }

    override fun onFlutterUiDisplayed() {
        fl_flutter.visibility = View.VISIBLE
    }

    override fun onFlutterUiNoLongerDisplayed() {

    }

    override fun onResume() {
        super.onResume()
        mFlutterEngine!!.lifecycleChannel.appIsResumed()
    }

    override fun onPause() {
        super.onPause()
        mFlutterEngine!!.lifecycleChannel.appIsInactive()
    }

    override fun onStop() {
        super.onStop()
        mFlutterEngine!!.lifecycleChannel.appIsPaused()
    }

}

在Application 中初始化FlutterEngine

 private fun initFlutter() {
        flutterEngine = FlutterEngine(this)
        flutterEngine!!.dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault())
        FlutterEngineCache.getInstance().put(KEY_FLUTTER_PAD,flutterEngine)
    }
val flutterRoute = intent.getStringExtra(FLUTTER_ROUTE_NAME) 这个是给flutter端传递参数用的,防止后期加需求,先把入口设计出来,用于后期区分跳转哪个页面,今天也是刚做到这一步,还没完善

Flutter 端 就简单做个接收处理就好了,

Widget _widgetForRoute(String routeName) {
  switch(routeName) {
    case "catering":
      return CateringWidget();

    default:
      return CateringWidget();
  }
}

runApp 运行这个代码就好了,我还有一些其他需求,在踩坑,但简单的集成到这一步就没问题。记录一下开发过程,网上的其他大佬写的太深,看不太懂,也欢迎大家留言讨论
To Be Continue

### 如何在 Android Studio 中创建多 Module 项目 #### 创建基础项目Android Studio 中创建一个多模块项目的前提是先建立一个基础项目。可以通过以下方式完成: 1. 打开 **Android Studio** 并选择 `File` -> `New` -> `New Project`。 2. 在弹出的窗口中,选择适合的基础模板(例如 Empty Activity 或 Flutter Application),并点击下一步。 3. 配置项目的基本设置,包括项目名称、保存路径以及编程语言等选项[^3]。 #### 添加新的 Module 一旦基础项目被成功创建,就可以向其中添加额外的模块。以下是具体操作方法: 1. 进入已有的项目,在顶部菜单栏找到并点击 `File` -> `New` -> `New Module...`。 2. 出现的新建模块对话框提供了多种类型的模块供选择,比如 Java/Kotlin Library、Android Library 和 Flutter Module 等[^4]。 对于非 Flutter 的标准 Android 应用程序开发而言,可以选择 `Android Library` 来构建一个新的库模块;而对于跨平台应用开发者,则可以根据需求选用相应的 Flutter 模块配置[^2]。 需要注意的是,当尝试添加 Flutter 模块到现有原生 Android 工程里时,由于某些版本更新可能导致 IDE 自动化工具暂时失效的情况发生。此时需按照官方文档指导进行手动集成步骤处理。 另外如果遇到类似于 “无法正常初始化新建工程”的错误提示信息,可能是因为系统环境变量或者软件安装包存在问题所致。可以检查相关依赖文件夹是否存在异常状况,必要情况下重新下载缺失组件来解决问题[^1]。 #### 修改 settings.gradle 文件 为了使新增加的 Modules 能够被整个项目识别出来,还需要编辑根目录下的 `settings.gradle` 文件,确保它包含了所有子模块的名字列表。例如: ```groovy include ':app', ':myLibrary' project(':myLibrary').projectDir = new File('path/to/myLibrary') ``` 这里假设我们刚刚加入了一个名为 myLibrary 的新模块,“path/to/myLibrary”应替换为你实际存储该模块的位置地址字符串表示形式。 通过上述流程即可顺利完成在一个 Android Studio 主工程项目内部嵌套管理多个独立功能部件的目标设定!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值