flutter_boost icon indicating copy to clipboard operation
flutter_boost copied to clipboard

我flutter升级到最新 运行example_new 出现问题 Activity无法转换为ExclusiveAppComponent<Activity>

Open Zhaoss opened this issue 3 years ago • 25 comments

/flutter_boost-master/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java:167: 错误: 不兼容的类型: Activity无法转换为ExclusiveAppComponent<Activity> getFlutterEngine().getActivityControlSurface().attachToActivity(getActivity(), getLifecycle());

我修改了下FlutterBoostActivity文件 在外层包裹了一层ExclusiveAppComponent

但又出现其他问题 , 我使用BoostNavigator.instance.pop(result); 在android原生界面得不到参数, 不知道和这个有没有关系.

Zhaoss avatar Oct 27 '21 08:10 Zhaoss

@Zhaoss

可以考虑先暂时将 Flutter SDK 切换到2.5.x

0xZOne avatar Nov 02 '21 13:11 0xZOne

请问下有兼容最新的Flutter SDK的计划吗?

lucian1024 avatar Dec 10 '21 09:12 lucian1024

请问下有兼容最新的Flutter SDK的计划吗?

正在推这个事情(戳我👇 PRissue),Flutter官方没有足够重视

对该问题有诉求的同学,请帮忙上去点赞或评论,推一把!! !谢谢🙏

0xZOne avatar Dec 10 '21 09:12 0xZOne

同样的问题,升级了最新的flutter之后无法使用

DavidMGT avatar Dec 14 '21 01:12 DavidMGT

@DavidMGT 作为临时解决方案,可以自己先「造」一个ExclusiveAppComponent,返回正确的Activity,应该可以工作。

0xZOne avatar Dec 15 '21 03:12 0xZOne

@DavidMGT 作为临时解决方案,可以自己先「造」一个ExclusiveAppComponent,返回正确的Activity,应该可以工作。

临时解决方案,示例如下:

diff --git a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java
index ab28533..1608eb5 100644
--- a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java
+++ b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java
@@ -152,7 +152,7 @@ public class FlutterBoostActivity extends FlutterActivity implements FlutterView
     private void performAttach() {
         if (!isAttached) {
             // Attach plugins to the activity.
-            getFlutterEngine().getActivityControlSurface().attachToActivity(getActivity(), getLifecycle());
+            getFlutterEngine().getActivityControlSurface().attachToActivity(delegate, getLifecycle());
 
             if (platformPlugin == null) {
                 platformPlugin = new PlatformPlugin(getActivity(), getFlutterEngine().getPlatformChannel());
diff --git a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostFragment.java b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostFragment.java
index b4ead66..5f954e6 100644
--- a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostFragment.java
+++ b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostFragment.java
@@ -43,6 +43,17 @@ public class FlutterBoostFragment extends FlutterFragment implements FlutterView
     private boolean isAttached = false;
     private boolean isFinishing = false;
 
+    class FakeExclusiveAppComponent implements io.flutter.embedding.android.ExclusiveAppComponent<Activity> {
+        public void detachFromFlutterEngine() {
+            // do nothing.
+        }
+
+        public Activity getAppComponent() {
+            return getActivity();
+        }
+    }
+    private FakeExclusiveAppComponent fakeAppComponent = new FakeExclusiveAppComponent();
+
     // @Override
     public void detachFromFlutterEngine() {
         /**
@@ -303,7 +314,7 @@ public class FlutterBoostFragment extends FlutterFragment implements FlutterView
     private void performAttach() {
         if (!isAttached) {
             // Attach plugins to the activity.
-            getFlutterEngine().getActivityControlSurface().attachToActivity(getActivity(), getLifecycle());
+            getFlutterEngine().getActivityControlSurface().attachToActivity(fakeAppComponent, getLifecycle());
 
             if (platformPlugin == null) {
                 platformPlugin = new PlatformPlugin(getActivity(), getFlutterEngine().getPlatformChannel());

0xZOne avatar Dec 21 '21 12:12 0xZOne

@DavidMGT 作为临时解决方案,可以自己先「造」一个ExclusiveAppComponent,返回正确的Activity,应该可以工作。

临时解决方案,示例如下:

diff --git a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java
index ab28533..1608eb5 100644
--- a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java
+++ b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java
@@ -152,7 +152,7 @@ public class FlutterBoostActivity extends FlutterActivity implements FlutterView
     private void performAttach() {
         if (!isAttached) {
             // Attach plugins to the activity.
-            getFlutterEngine().getActivityControlSurface().attachToActivity(getActivity(), getLifecycle());
+            getFlutterEngine().getActivityControlSurface().attachToActivity(delegate, getLifecycle());
 
             if (platformPlugin == null) {
                 platformPlugin = new PlatformPlugin(getActivity(), getFlutterEngine().getPlatformChannel());
diff --git a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostFragment.java b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostFragment.java
index b4ead66..5f954e6 100644
--- a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostFragment.java
+++ b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostFragment.java
@@ -43,6 +43,17 @@ public class FlutterBoostFragment extends FlutterFragment implements FlutterView
     private boolean isAttached = false;
     private boolean isFinishing = false;
 
+    class FakeExclusiveAppComponent implements io.flutter.embedding.android.ExclusiveAppComponent<Activity> {
+        public void detachFromFlutterEngine() {
+            // do nothing.
+        }
+
+        public Activity getAppComponent() {
+            return getActivity();
+        }
+    }
+    private FakeExclusiveAppComponent fakeAppComponent = new FakeExclusiveAppComponent();
+
     // @Override
     public void detachFromFlutterEngine() {
         /**
@@ -303,7 +314,7 @@ public class FlutterBoostFragment extends FlutterFragment implements FlutterView
     private void performAttach() {
         if (!isAttached) {
             // Attach plugins to the activity.
-            getFlutterEngine().getActivityControlSurface().attachToActivity(getActivity(), getLifecycle());
+            getFlutterEngine().getActivityControlSurface().attachToActivity(fakeAppComponent, getLifecycle());
 
             if (platformPlugin == null) {
                 platformPlugin = new PlatformPlugin(getActivity(), getFlutterEngine().getPlatformChannel());

请问这个能出个release tag吗?

lucian1024 avatar Jan 10 '22 03:01 lucian1024

@DavidMGT 作为临时解决方案,可以自己先「造」一个ExclusiveAppComponent,返回正确的Activity,应该可以工作。

临时解决方案,示例如下:

diff --git a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java
index ab28533..1608eb5 100644
--- a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java
+++ b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostActivity.java
@@ -152,7 +152,7 @@ public class FlutterBoostActivity extends FlutterActivity implements FlutterView
     private void performAttach() {
         if (!isAttached) {
             // Attach plugins to the activity.
-            getFlutterEngine().getActivityControlSurface().attachToActivity(getActivity(), getLifecycle());
+            getFlutterEngine().getActivityControlSurface().attachToActivity(delegate, getLifecycle());
 
             if (platformPlugin == null) {
                 platformPlugin = new PlatformPlugin(getActivity(), getFlutterEngine().getPlatformChannel());
diff --git a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostFragment.java b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostFragment.java
index b4ead66..5f954e6 100644
--- a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostFragment.java
+++ b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterBoostFragment.java
@@ -43,6 +43,17 @@ public class FlutterBoostFragment extends FlutterFragment implements FlutterView
     private boolean isAttached = false;
     private boolean isFinishing = false;
 
+    class FakeExclusiveAppComponent implements io.flutter.embedding.android.ExclusiveAppComponent<Activity> {
+        public void detachFromFlutterEngine() {
+            // do nothing.
+        }
+
+        public Activity getAppComponent() {
+            return getActivity();
+        }
+    }
+    private FakeExclusiveAppComponent fakeAppComponent = new FakeExclusiveAppComponent();
+
     // @Override
     public void detachFromFlutterEngine() {
         /**
@@ -303,7 +314,7 @@ public class FlutterBoostFragment extends FlutterFragment implements FlutterView
     private void performAttach() {
         if (!isAttached) {
             // Attach plugins to the activity.
-            getFlutterEngine().getActivityControlSurface().attachToActivity(getActivity(), getLifecycle());
+            getFlutterEngine().getActivityControlSurface().attachToActivity(fakeAppComponent, getLifecycle());
 
             if (platformPlugin == null) {
                 platformPlugin = new PlatformPlugin(getActivity(), getFlutterEngine().getPlatformChannel());

使用这个临时解决方案之后,进入Flutter页面 -- 退出Flutter页面 -- 再进入Flutter页面的时候,会报错,报错信息如下,你那边没这问题吗? image

gaoyangcr7 avatar Feb 10 '22 03:02 gaoyangcr7

@0xZOne 这个临时解决方案怎么用的

tbLibs avatar Feb 22 '22 08:02 tbLibs

这个问题还存在,建议写在install文档中,把坑明示出来。

zhengzhou avatar Feb 25 '22 08:02 zhengzhou

这个问题真得没有更好的方案吗 好麻烦 各种适配

qinshizuojia avatar Mar 15 '22 11:03 qinshizuojia

我也遇到了这个问题

AnTiZhang avatar Mar 17 '22 08:03 AnTiZhang

我也遇到这个问题了

ChinaVolvocars avatar Apr 14 '22 03:04 ChinaVolvocars

+1

shingohu avatar Apr 18 '22 01:04 shingohu

这个是很严重的问题难道没人来解决下吗

GCY-Galen avatar May 11 '22 09:05 GCY-Galen

@0xZOne , 我看了你的pr,后面你不是重新修改了吗?,你的最新修改是不是已经被合并进去了?

edison0951 avatar May 14 '22 08:05 edison0951

+1 求解决

zmGitHub avatar May 23 '22 09:05 zmGitHub

@0xZOne , 我看了你的pr,后面你不是重新修改了吗?,你的最新修改是不是已经被合并进去了?

是的,已经合到官方主线了。 如果使用的是Flutter3.0的话,这个问题的修复方案,可以参考:https://github.com/0xZOne/flutter_boost/commit/40a79d5e6e0d76eb7128a65230d8ac3796f7ae3b

0xZOne avatar May 24 '22 01:05 0xZOne

@0xZOne , 我看了你的pr,后面你不是重新修改了吗?,你的最新修改是不是已经被合并进去了?

是的,已经合到官方主线了。 如果使用的是Flutter3.0的话,这个问题的修复方案,可以参考:0xZOne@40a79d5

我现在升级到flutter 3.0,发现还是报错呢。

edison0951 avatar May 25 '22 01:05 edison0951

@edison0951 Flutter3.0虽然拥有了接口,但FlutterBoost这边也要做相应的修改才行。请参考:0xZOne@40a79d5

0xZOne avatar May 25 '22 02:05 0xZOne

+1

nepaul avatar Jun 07 '22 09:06 nepaul

@edison0951 Flutter3.0虽然拥有了接口,但FlutterBoost这边也要做相应的修改才行。请参考:0xZOne@40a79d5

3Q

LailaiMaster avatar Jun 13 '22 04:06 LailaiMaster

我修改了下FlutterBoostActivity文件 在外层包裹了一层ExclusiveAppComponent 我现在用的是这个v3.0-null-safety-release.2.1,刚刚你发的这个修改是不是没合并进去?

edison0951 avatar Jul 05 '22 03:07 edison0951

我修改了下FlutterBoostActivity文件 在外层包裹了一层ExclusiveAppComponent 我现在用的是这个v3.0-null-safety-release.2.1,刚刚你发的这个修改是不是没合并进去?

这个修改: https://github.com/0xZOne/flutter_boost/commit/40a79d5e6e0d76eb7128a65230d8ac3796f7ae3b 是给需要的同学一个参考,没有合并到主线。

0xZOne avatar Jul 05 '22 03:07 0xZOne

我修改了下FlutterBoostActivity文件 在外层包裹了一层ExclusiveAppComponent 我现在用的是这个v3.0-null-safety-release.2.1,刚刚你发的这个修改是不是没合并进去?

这个修改: 0xZOne@40a79d5 是给需要的同学一个参考,没有合并到主线。 我看了那个修改,应该会修改到源代码吧,这样后面升级就很困难了。

edison0951 avatar Jul 05 '22 05:07 edison0951

最新主线已经支持Flutter3.0

0xZOne avatar Aug 11 '22 07:08 0xZOne