我在 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
或 默认入口点 .不幸的是,每当我尝试添加自己的
FlutterFragment
使用 自定义入口点 ,它似乎不接受我在 .add(<INVALID_TYPE>,...,...)
中传递的对象类型FragmentTransaction
的方法.有没有机会我仍然可以使用
FlutterFragment
作为我拥有的 Flutter 剖面 View 的容器?设置
环境
最佳答案
什么地方出了错?
目前,如果您使用 安卓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 代码的行为方式。 .进一步阅读
关于android - 如何使用带有自定义入口点的 FlutterFragment 在我的 Android 应用程序中嵌入 Flutter 布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59529885/