gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:37:59 25 4
gpt4 key购买 nike

我在 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com