From 71e6138c3544d76a1a2825e79a33f95de1ec1eec Mon Sep 17 00:00:00 2001 From: justin <noborder@qq.com> Date: Tue, 31 Mar 2020 10:01:34 +0800 Subject: [PATCH] Git pick master --- Frequently Asked Question.md | 40 +++++++++++++++++-- .../idlefish/flutterboost/FlutterBoost.java | 3 ++ .../flutterboost/FlutterBoostPlugin.java | 4 ++ .../containers/FlutterFragment.java | 37 +++++++++++++++-- 4 files changed, 77 insertions(+), 7 deletions(-) diff --git a/Frequently Asked Question.md b/Frequently Asked Question.md index 29d733e..dcc9115 100644 --- a/Frequently Asked Question.md +++ b/Frequently Asked Question.md @@ -42,13 +42,13 @@ bool isTopContainer = FlutterBoost.BoostContainer.of(context).onstage 回ç”:官方的解决方案仅仅是在native侧对FlutterViewControllerå’ŒFlutterengine进行解耦,如æ¤å¯ä»¥ä¸€ä¸ªFlutterEngine切æ¢ä¸åŒçš„FlutterViewController或者Activity进行渲染。但其并未解决Nativeå’ŒFlutter页é¢æ··åˆçš„é—®é¢˜ï¼Œæ— æ³•ä¿è¯ä¸¤ä¾§çš„页é¢ç”Ÿå‘½å‘¨æœŸä¸€è‡´ã€‚å³ä½¿æ˜¯Flutter官方针对这个问题也是建议使用FlutterBoost。 其差别主è¦æœ‰ï¼š -|*|FlutterBoost1.5 |Flutter官方方案 |其他框架| +|*|FlutterBoost2.0 |Flutter官方方案 |其他框架| |----|----|----|----| |是å¦æ”¯æŒæ··åˆé¡µé¢ä¹‹é—´éšæ„跳转 |Y |N |Y| |一致的页é¢ç”Ÿå‘½å‘¨æœŸç®¡ç†(多Flutter页é¢) |Y |N |?| |是å¦æ”¯æŒé¡µé¢é—´æ•°æ®ä¼ 递(å›žä¼ ç‰) |Y |N |N| |是å¦æ”¯æŒæµ‹æ»‘手势 |Y |Y |Y| -|是å¦æ”¯æŒè·¨é¡µçš„hero动画 |N |Y |N| +|是å¦æ”¯æŒè·¨é¡µçš„hero动画 |Y |Y |N| |内å˜ç‰èµ„æºå 用是å¦å¯æŽ§ |Y |Y |Y| |是å¦æ供一致的页é¢route方案 |Y |Y |N| |iOSå’ŒAndroid能力åŠæŽ¥å£æ˜¯å¦ä¸€è‡´ |Y |N |N| @@ -57,6 +57,40 @@ bool isTopContainer = FlutterBoost.BoostContainer.of(context).onstage åŒæ—¶FlutterBoost也æ供了一次性创建混åˆå·¥ç¨‹çš„命令:flutterboot。代ç å‚考:https://github.com/alibaba-flutter/flutter-boot -### 如果我需è¦é€šè¿‡FlutterViewControllerå†å¼¹å‡ºä¸€ä¸ªæ–°çš„但frame比较å°çš„FlutterViewController,应该怎么实现? +### 7. 如果我需è¦é€šè¿‡FlutterViewControllerå†å¼¹å‡ºä¸€ä¸ªæ–°çš„但frame比较å°çš„FlutterViewController,应该怎么实现? 回ç”:如果ä¸åŠ 处ç†ä¼šé‡åˆ°window大å°å˜åŒ–的问题,但å¯ä»¥è§£å†³ã€‚具体å¯ä»¥å‚考这个issue:https://github.com/alibaba/flutter_boost/issues/435 +### 8. Flutter ViewControllerå¦‚ä½•è®¾ç½®æ¨ªå± +VC设置横å±ä¾èµ–于NavigationController或者rootVC。å¯ä»¥é€šè¿‡ä¸€ä¸‹æ–¹å¼æ¥è®¾ç½®ï¼š +1. dart层的SystemChrome.setPreferredOrientations函数并éžç›´æŽ¥è®¾ç½®è½¬å‘,而是设置页é¢ä¼˜å…ˆä½¿ç”¨çš„转å‘(preferred) +2. app的转å‘控制除了info.plist的设置外,主è¦å—UIWindow.rootViewControlleræŽ§åˆ¶ã€‚å¤§æ¦‚è¿‡ç¨‹æ˜¯è¿™æ ·çš„ï¼šç¡¬ä»¶æ£€æµ‹åˆ°è½¬å‘,就会调用UIWindow的转å‘函数,然åŽè°ƒç”¨å…¶rootViewControllerçš„shouldAutorotate判æ–是å¦éœ€è¦è‡ªåŠ¨è½¬ï¼Œç„¶åŽå–supportedInterfaceOrientationså’Œinfo.plistä¸è®¾ç½®çš„交集æ¥åˆ¤æ–å¯å¦è½¬ +3. 对于UIViewControllerä¸çš„转å‘,也åªåœ¨rootviewcontrollerä¸æ‰æœ‰æ•ˆ + +举例如下,实现æ¥éª¤å¯ä»¥è¿™æ ·ï¼š +1. é‡å†™NavigationController: +```objc +-(BOOL)shouldAutorotate +{ +// id currentViewController = self.topViewController; +// +// +// if ([currentViewController isKindOfClass:[FlutterViewController class]]) +// return [currentViewController shouldAutorotate]; + + return YES; +} + +-(UIInterfaceOrientationMask)supportedInterfaceOrientations +{ + id currentViewController = self.topViewController; + if ([currentViewController isKindOfClass:[FlutterViewController class]]){ + NSLog(@"[XDEBUG]----fvc supported:%ld\n",[currentViewController supportedInterfaceOrientations]); + return [currentViewController supportedInterfaceOrientations]; + } + return UIInterfaceOrientationMaskAll; +} +``` +2. 改dartå±‚ï¼šå› ä¸ºSystemChrome.setPreferredOrientations的设置是全局的,但混åˆæ ˆæ˜¯å¤šé¡µé¢ï¼Œæ‰€ä»¥åœ¨main函数ä¸è®¾ç½®ï¼ŒåŽé¢åœ¨æ–°å»ºä¸€ä¸ªFlutterViewController时会被冲掉。为了解决这个问题,需è¦åœ¨æ¯ä¸ªdart页é¢çš„buildå¤„éƒ½åŠ ä¸Šè¿™è¯å¥æ¥è®¾ç½®æ¯ä¸ªé¡µé¢èƒ½æ”¯æŒå“ªäº›è½¬å‘类型 + +### 9. FlutterBoost for flutter1.12出现和surface相关的crash。å¯ä»¥å‚考这个issue:https://github.com/flutter/flutter/issues/52455 +å¯èƒ½flutter engineçš„bug引起 diff --git a/android/src/main/java/com/idlefish/flutterboost/FlutterBoost.java b/android/src/main/java/com/idlefish/flutterboost/FlutterBoost.java index 740d49f..13b01bb 100644 --- a/android/src/main/java/com/idlefish/flutterboost/FlutterBoost.java +++ b/android/src/main/java/com/idlefish/flutterboost/FlutterBoost.java @@ -5,6 +5,9 @@ import android.app.Activity; import android.app.Application; import android.content.Context; import android.os.Bundle; +import android.os.Debug; + +import androidx.annotation.NonNull; import android.support.annotation.NonNull; import com.idlefish.flutterboost.interfaces.*; diff --git a/android/src/main/java/com/idlefish/flutterboost/FlutterBoostPlugin.java b/android/src/main/java/com/idlefish/flutterboost/FlutterBoostPlugin.java index 7fc5bf7..e4223d1 100644 --- a/android/src/main/java/com/idlefish/flutterboost/FlutterBoostPlugin.java +++ b/android/src/main/java/com/idlefish/flutterboost/FlutterBoostPlugin.java @@ -1,6 +1,10 @@ package com.idlefish.flutterboost; import android.support.annotation.Nullable; +import android.os.Handler; +import android.util.Log; + +import androidx.annotation.Nullable; import android.util.Log; import com.idlefish.flutterboost.interfaces.IContainerRecord; diff --git a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterFragment.java b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterFragment.java index e3a1774..bddad53 100644 --- a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterFragment.java +++ b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterFragment.java @@ -2,6 +2,9 @@ package com.idlefish.flutterboost.containers; import android.app.Activity; import android.arch.lifecycle.Lifecycle; +import android.graphics.Color; +import android.view.*; +import androidx.lifecycle.Lifecycle; import android.content.Context; import android.content.Intent; import android.os.Build; @@ -253,19 +256,32 @@ public class FlutterFragment extends Fragment implements FlutterActivityAndFragm @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + configureStatusBarForFullscreenFlutterExperience(); return delegate.onCreateView(inflater, container, savedInstanceState); } + private void configureStatusBarForFullscreenFlutterExperience() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = this.getActivity().getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.TRANSPARENT); + window.getDecorView().setSystemUiVisibility(PlatformPlugin.DEFAULT_SYSTEM_UI | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + } @Override public void onStart() { super.onStart(); - delegate.onStart(); + if (!isHidden()) { + delegate.onStart(); + } } @Override public void onResume() { super.onResume(); - delegate.onResume(); + if (!isHidden()) { + delegate.onResume(); + } } // TODO(mattcarroll): determine why this can't be in onResume(). Comment reason, or move if possible. @@ -277,13 +293,17 @@ public class FlutterFragment extends Fragment implements FlutterActivityAndFragm @Override public void onPause() { super.onPause(); - delegate.onPause(); + if (!isHidden()) { + delegate.onPause(); + } } @Override public void onStop() { super.onStop(); - delegate.onStop(); + if (!isHidden()) { + delegate.onStop(); + } } @Override @@ -300,6 +320,15 @@ public class FlutterFragment extends Fragment implements FlutterActivityAndFragm delegate = null; } + @Override + public void onHiddenChanged(boolean hidden) { + super.onHiddenChanged(hidden); + if (hidden) { + delegate.onPause(); + } else { + delegate.onResume(); + } + } @ActivityCallThrough public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { -- 2.26.2