4Manuals

  • PDF Cloud HOME

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

    从文件初始化类的最佳方法(异步)? 如何在Android中使用WebRTC缩放相机 Android 10,API29:在应用程序文件夹中使用C ++库编写文件会使应用程序崩溃 如何将动态值传递给渐变xml 加载数据并推送到未显示的RecyclerView中 调用Model类的函数时出现java.lang.NullPointerException 此声明在dart中的Future类中意味着什么:FutureOr <R>函数(动态)onValue 从网络加载图像时,“接收到完整的报头之前关闭连接 Ionic 3错误:“缺少文件google-services.json。没有它,Google Services插件将无法运行。”在离子科尔多瓦建立/准备Android BackdropFilter如何应用它的过滤器?

我正在Flutter中尝试的此功能称为添加到应用。

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

从文档example中可以看出,我应该能够添加newFlutterFragment,就像在Android中添加普通Fragment类一样。

// 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 </strong加热main时,它才有效>或默认入口点。

image-1

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

image-1

我有没有机会仍然将FragmentTransaction用作我的Flutter剖视图的容器?

设置

  • Android取决于Flutter模块的源代码(选项B )
  • 带有AndroidX的Android项目

环境

  • Flutter:v1.12.13 + hotfix.5(稳定)
  • Dart:v2.4.0
  • 操作系统:macOS Catalina v1.14.5

1 个答案:

答案 0 :(得分:1)

出了什么问题?

目前,如果您使用的是 AndroidX ,则可以使用FlutterFragment嵌入Flutter布局的唯一方法是将其添加为 Android存档( AAR)。

我以前在Github中打开了一个issue来解决此问题,在撰写本文时它仍然处于打开状态。

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

Here's文档,介绍如何通过将Flutter源代码添加为AAR模块来设置Android项目。

  

但是为什么真正使用AAR?

在内部,FlutterFragment和下面的一些(如果不是全部)类 FlutterFragment仍在使用支持库,而不是AndroidX,依赖项存在不匹配。使用AAR并在编译期间启用了jetifier时,Flutter的AAR输出现在将使用等效的AndroidX库,这在运行时。

  

但是,我需要我的团队在处理Flutter应用程序功能的同时,对Android应用程序项目进行一些更改。

好吧,由于您不能在该特定类型的设置中使用io.flutter.embedding,因此您仍然可以使用FlutterFragment,特别是如果您仅在Android应用中显示Flutter布局的一部分时。

feature_fragment.kt

FlutterView

feature_layout.xml

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 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的好处之一是易于同时管理Android和Flutter代码的生命周期。不用担心,您仍然可以通过使用所附的FlutterView管理其生命周期来处理Flutter代码的行为。

进一步阅读

  • https://api.flutter.dev/javadoc/io/flutter/embedding/engine/FlutterEngine.html#getLifecycleChannel
  • https://flutter.dev/docs/development/add-to-app/android/project-setup



Similar searches
    在开发功能时如何在不更新到测试阶段或任何其他测试人员的情况下测试构建 Azure APIM-支持强大 使用UDP在另一台计算机上广播视频 SpringBoot中的Tika解析器配置 从多个复选框获取值作为字符串