我在Flutter中尝试的此功能称为“添加到应用”。
我阅读了他们的文档中包含的有关如何添加FlutterFragment
为应用程序部分的说明。
从文档示例中可以看出,我应该能够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剖视图的容器?
设定
环境
什么地方出了错?
到目前为止,如果您使用的是AndroidX,则可以将FlutterFragment
嵌入Flutter布局的唯一方法是将其作为Android存档(AAR)添加到依赖项中。
我以前在Github中就此问题打开过一个问题,在撰写本文时仍未解决。
将Flutter添加为AAR依赖项既有优点也有缺点。使用AAR,您的团队无需在本地计算机上安装Flutter SDK,也不需要安装Dart SDK。但是,由于AAR文件是已编译的工件,因此您的团队可能无法在开发期间编辑项目的Flutter源代码。
这是有关如何通过将Flutter源代码添加为AAR模块来设置Android项目的文档。
但是为什么真正使用AAR?
在幕后,FlutterFragment
并且其中的某些(如果不是全部)类io.flutter.embedding
仍在使用支持库,而不是AndroidX,则依赖项不匹配。启用AAR并在编译过程中启用jetifier时,Flutter的AAR输出现在将使用等效的AndroidX库,这在运行时不会发生。
但是,我需要我的团队在处理某些Flutter应用程序功能的同时,还要对Android应用程序项目进行一些更改。
好吧,由于您无法使用FlutterFragment
该特定类型的设置,因此您仍然可以使用FlutterView
,特别是如果您仅在Android应用中显示Flutter布局的一部分时。
feature_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)
}
feature_layout.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代码的生命周期。不用担心,您仍然可以通过使用附件管理Flutter代码的生命周期来处理Flutter代码的行为FlutterEngine
。
进一步阅读
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句