更新flutter1.12之前版本创建的项目

353 阅读2分钟

原文

如果你的项目在flutter版本为1.12之前创建的,可以参照此文

背景

为了更好地支持将 Flutter 添加到现有项目的执行环境,在io.flutter.app.FlutterActivity及其关联的类中托管 Flutter 运行时的旧 Android 平台端封装程序现在已弃用。io.flutter.embedding.android.FlutterActivity和相关类的新封装现在取代了它们。

这些类可以更好地支持真实世界的场景,其中FlutterActivity不是应用程序中的第一个也是唯一的 Android 活动。

Motivation

您现有的full-Flutter项目不会立即受到影响,在可预见的将来将继续像以前一样工作。

然而,新的Android包装也引入了一套新的Android插件开发 API。专门开发的新插件API插件在旧的1.12 Android项目上不起作用。构建使用 1.12 之后创建的插件的 1.12 之前 Android 项目将产生生成时间错误,除非插件开发人员明确选择创建第二个向后兼容实现。

旧 Android API 不再官方支持Add-to-app。如果您在 1.12 之前遵循 wiki 中有关添加到应用的实验说明,则应遵循下面的"添加到应用"部分下的迁移步骤。

full-Flutter

前提是你没有修改你的flutter项目的Android主项目,如果你修改了,参照下面的Add-to-app部分

如果你打算迁移用flutter create命令创建的项目,可以参照下面的步骤:

1a. android/app/src/main/java/[your/package/name]/MainActivity.java如果此文件你没有添加过自己的代码,可以移除MainActivity.java里面的内容和改变FlutterActivity的导包,如下: 前面-号是要删除的,+号是要添加的

// MainActivity.java
-import android.os.Bundle;
-import io.flutter.app.FlutterActivity;
+import io.flutter.embedding.android.FlutterActivity;
-import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {
-  @Override
-  protected void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    GeneratedPluginRegistrant.registerWith(this);
-  }
 }
// MainActivity.kt
-import android.os.Bundle
-import io.flutter.app.FlutterActivity
+import io.flutter.embedding.android.FlutterActivity
-import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {
-  override fun onCreate(savedInstanceState: Bundle?) {
-    super.onCreate(savedInstanceState)
-    GeneratedPluginRegistrant.registerWith(this)
-  }
}

因为MainActivity内容现在是空的,你可以选择删除MainActivity.java/kt文件。如果删除了,需要将AndroidManifest.xml.MainActivity引用改io.flutter.embedding.android.FlutterActivity

1b. 如果你有自己的platform channel代码,可以参照下面的例子修改来适应新的嵌入api:

-import io.flutter.app.FlutterActivity;
-import io.flutter.plugin.common.MethodCall;
+import androidx.annotation.NonNull;
+import io.flutter.embedding.android.FlutterActivity;
+import io.flutter.embedding.engine.FlutterEngine;
 import io.flutter.plugin.common.MethodChannel;
-import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
-import io.flutter.plugin.common.MethodChannel.Result;
+import io.flutter.plugins.GeneratedPluginRegistrant;

 public class MainActivity extends FlutterActivity {
     private static final String CHANNEL = "samples.flutter.dev/battery";
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-
-        super.onCreate(savedInstanceState);
-        GeneratedPluginRegistrant.registerWith(this);
-
-        new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
-                new MethodCallHandler() {
-                    @Override
-                    public void onMethodCall(MethodCall call, Result result) {
-                        // Your existing code
-                    }
-                });
-    }
+
+    @Override
+    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
+        GeneratedPluginRegistrant.registerWith(flutterEngine);
+        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
+                .setMethodCallHandler(
+                    (call, result) -> {
+                        // Your existing code
+                }
+        );
+    }
 }

移除onCreate里的channel注册代码,改用configureFlutterEngine,弃用getFlutterView()改用flutterEngine.getDartExecutor().getBinaryMessenger()来传递数据

  1. 打开android/app/src/main/AndroidManifest.xml

以前的配置:

<application
  android:name="io.flutter.app.FlutterApplication"
  >
  <!-- code omitted -->
</application>

现在的配置

<application
  >
  <!-- code omitted -->
</application>
  1. splash

<meta-data
    android:name="flutterEmbedding"
    android:value="2" />