android - 如何使用带有自定义入口点的 FlutterFragment 在我的 Android 应用程序中嵌入 Flutter 布局?

标签 android kotlin flutter dart androidx

我在 Flutter 中尝试的这个功能叫做 添加到应用程序 .

我阅读了他们的documentation 中包含的说明。关于如何添加 FlutterFragment作为我的应用程序中的一个部分。

如文档 example 中所示,我应该可以添加我的newFlutterFragment就像我如何添加普通 Fragment Android 中的类。

// Create and attach a FlutterFragment if one does not exist.
if (flutterFragment == null) {
  var newFlutterFragment = FlutterFragment.createDefault()
  flutterFragment = newFlutterFragment
  fragmentManager
    .beginTransaction()
    .add(
      R.id.fragment_container,
      newFlutterFragment,
      TAG_FLUTTER_FRAGMENT
    )
    .commit()
}

我们的示例非常简单,但是,根据检查(Github 和 SO),它仅在您预热 FlutterEngine 时才有效。使用 main 默认入口点 .

image-1

不幸的是,每当我尝试添加自己的 FlutterFragment使用 自定义入口点 ,它似乎不接受我在 .add(<INVALID_TYPE>,...,...) 中传递的对象类型FragmentTransaction 的方法.

image-1

有没有机会我仍然可以使用 FlutterFragment作为我拥有的 Flutter 剖面 View 的容器?

设置
  • Android 依赖 Flutter 模块的源代码( Option B )
  • 带有 AndroidX 的 Android 项目

  • 环境
  • Flutter:v1.12.13+hotfix.5(稳定版)
  • Dart :v2.4.0
  • 操作系统:macOS Catalina v1.14.5
  • 最佳答案

    什么地方出了错?

    目前,如果您使用 安卓X ,您可以使用的唯一方法FlutterFragment在嵌入你的 Flutter 布局时,它被添加为 Android 存档 (AAR) 在您的依赖项中。

    我之前开过issue在 Github 关于这个问题,在撰写本文时它仍然是开放的。

    将 Flutter 添加为 AAR 依赖项既有优点也有缺点。使用 AAR,您的团队不需要在本地机器上安装 Flutter SDK,也不需要安装 Dart SDK。但是,由于 AAR 文件是编译后的工件,因此您的团队可能无法在开发期间编辑项目的 Flutter 源代码。

    Here's有关如何使用作为 AAR 模块添加的 Flutter 源代码来设置 Android 项目的文档。

    But why really use AAR?



    在引擎盖下,FlutterFragment以及下面的一些(如果不是全部)类io.flutter.embedding仍在使用支持库而不是 AndroidX,有一个 依赖项不匹配 .使用 AAR 和您的 jetifier 期间启用编译 ,您的 Flutter 的 AAR 输出现在将使用等效的 AndroidX 库,这在 期间不会发生。运行时间 .

    But, I need my team to work on some Flutter app features simultaneously with some Android app project changes.



    好吧,既然你不能使用 FlutterFragment在该特定类型的设置中,您仍然可以使用 FlutterView ,特别是如果您只在 Android 应用程序中显示部分 Flutter 布局。

    特征 fragment .kt
    portfolioEngine?.let { flutterEngine ->
        // Start executing Dart code to pre-warm the FlutterEngine.
        // https://github.com/flutter/flutter/wiki/Experimental:-Launch-Flutter-with-non-main-entrypoint
        flutterEngine.dartExecutor.executeDartEntrypoint(
            DartExecutor.DartEntrypoint(
                FlutterMain.findAppBundlePath(),
                "customEntryPoint"
            )
        )
    
        // Cache the FlutterEngine to be used by FlutterActivity.
        FlutterEngineCache
            .getInstance()
            .put("SOME_FLUTTER_ENGINE_NAME", flutterEngine)
    
        // Add the Flutter layout
        flutterView = FlutterView(context)
        flutterView.attachToFlutterEngine(flutterEngine)
        flutterContainerView?.removeAllViews() // Only if deemed necessary
        flutterContainerView?.addView(flutterView)
    }
    

    特征布局.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <FrameLayout
            android:id="@+id/flutterContainerView"
            android:layout_width="match_parent"
            android:layout_height="300dp" />
    </LinearLayout>
    

    但是,有一个小问题...

    使用 FlutterActivity 的好处之一或 FlutterFragment超过 FlutterView是同时管理 Android 和 Flutter 代码生命周期的便利性。不用担心,您仍然可以通过使用附加的 FlutterEngine 管理其生命周期来处理 Flutter 代码的行为方式。 .

    进一步阅读
  • https://api.flutter.dev/javadoc/io/flutter/embedding/engine/FlutterEngine.html#getLifecycleChannel
  • https://flutter.dev/docs/development/add-to-app/android/project-setup
  • 关于android - 如何使用带有自定义入口点的 FlutterFragment 在我的 Android 应用程序中嵌入 Flutter 布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59529885/

    相关文章:

    android - 如何预分配 RadialGradient?

    android - 获取空异常

    java - 房间递归关系解决方法

    android - 等待 Kotlin 协程在 onCreateView() 中完成

    flutter - Firebase App Check 拒绝来自 Android 设备的所有请求

    android - Android studio 中的 Github "PUT"请求

    android - 一个android项目怎么会有两个AndroidManifest.xml文件

    gradle - 如何将 Kotlin 源码的测试报告上传到 Coveralls?

    routes - Flutter 重定向到 initState 上的页面

    ios - H。将Firebase添加到Flutter应用时找不到文件