如果你的项目在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()来传递数据
- 打开
android/app/src/main/AndroidManifest.xml
以前的配置:
<application
android:name="io.flutter.app.FlutterApplication"
>
<!-- code omitted -->
</application>
现在的配置
<application
>
<!-- code omitted -->
</application>
-
splash
<meta-data
android:name="flutterEmbedding"
android:value="2" />