diff --git a/docs/install.md b/docs/install.md index 488df06a..b3cf5a40 100755 --- a/docs/install.md +++ b/docs/install.md @@ -167,8 +167,6 @@ implementation project(':flutter_boost') - - ``` 然后点击右上角的sync同步一下,就会开始一些下载和同步的进程,等待完成 @@ -181,23 +179,41 @@ public class App extends Application { public void onCreate() { super.onCreate(); FlutterBoost.instance().setup(this, new FlutterBoostDelegate() { + + private void startActivityForResult(Intent intent, int requestCode) { + FlutterViewContainer topContainer = FlutterBoost.instance().getTopContainer(); + if (topContainer instanceof FlutterFragment) { + //如果是从FlutterBoostFragment唤起的新页面,只有使用FlutterFragment进行start,才能收到result + ((FlutterFragment) topContainer).startActivityForResult(intent, requestCode); + } else if (topContainer instanceof FlutterActivity) { + ((FlutterActivity) topContainer).startActivityForResult(intent, requestCode); + } else { + FlutterBoost.instance().currentActivity().startActivityForResult(intent, + requestCode); + } + } + @Override public void pushNativeRoute(FlutterBoostRouteOptions options) { //这里根据options.pageName来判断你想跳转哪个页面,这里简单给一个 - Intent intent = new Intent(FlutterBoost.instance().currentActivity(), YourTargetAcitvity.class); - FlutterBoost.instance().currentActivity().startActivityForResult(intent, options.requestCode()); + //TODO 这里的currentActivity在FlutterBoost延迟初始化+第一个页面是FlutterBoostFragment时,可能存在NPE, + //TODO 建议使用自己管理的堆栈的顶层Activity + Context context = FlutterBoost.instance().currentActivity(); + Intent intent = new Intent(context, YourTargetAcitvity.class); + startActivityForResult(intent, options.requestCode()); } @Override public void pushFlutterRoute(FlutterBoostRouteOptions options) { + Context context = FlutterBoost.instance().currentActivity(); Intent intent = new FlutterBoostActivity.CachedEngineIntentBuilder(FlutterBoostActivity.class) .backgroundMode(FlutterActivityLaunchConfigs.BackgroundMode.transparent) .destroyEngineWithActivity(false) .uniqueId(options.uniqueId()) .url(options.pageName()) .urlParams(options.arguments()) - .build(FlutterBoost.instance().currentActivity()); - FlutterBoost.instance().currentActivity().startActivity(intent); + .build(context); + startActivityForResult(intent, options.requestCode(); } }, engine -> { }); @@ -325,21 +341,3 @@ FlutterBoost.instance().setup(application, delegate: delegate) { engine in ``` 到此为止,所有的前置内容均已完成 - - - - - - - - - - - - - - - - - - diff --git a/example/android/app/src/main/java/com/idlefish/flutterboost/example/MyFlutterBoostDelegate.java b/example/android/app/src/main/java/com/idlefish/flutterboost/example/MyFlutterBoostDelegate.java index 0c786dea..687d84a7 100644 --- a/example/android/app/src/main/java/com/idlefish/flutterboost/example/MyFlutterBoostDelegate.java +++ b/example/android/app/src/main/java/com/idlefish/flutterboost/example/MyFlutterBoostDelegate.java @@ -1,5 +1,6 @@ package com.idlefish.flutterboost.example; +import android.content.Context; import android.content.Intent; import android.widget.Toast; @@ -7,36 +8,68 @@ import com.idlefish.flutterboost.FlutterBoostDelegate; import com.idlefish.flutterboost.FlutterBoostRouteOptions; import com.idlefish.flutterboost.containers.FlutterBoostActivity; +import com.idlefish.flutterboost.containers.FlutterViewContainer; +import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.android.FlutterActivityLaunchConfigs.BackgroundMode; +import io.flutter.embedding.android.FlutterFragment; public class MyFlutterBoostDelegate implements FlutterBoostDelegate { + private Context getCurrentContext() { + FlutterViewContainer topContainer = FlutterBoost.instance().getTopContainer(); + Context context = null; + if (topContainer != null) { + context = topContainer.getContextActivity(); + } + if (context == null) { + context = FlutterBoost.instance().currentActivity(); + } + return context; + } + + private void startActivityForResult(Intent intent, int requestCode) { + FlutterViewContainer topContainer = FlutterBoost.instance().getTopContainer(); + if (topContainer instanceof FlutterFragment) { + //如果是从FlutterBoostFragment唤起的新页面,只有使用FlutterFragment进行start,才能收到result + ((FlutterFragment) topContainer).startActivityForResult(intent, requestCode); + } else if (topContainer instanceof FlutterActivity) { + ((FlutterActivity) topContainer).startActivityForResult(intent, requestCode); + } else { + FlutterBoost.instance().currentActivity().startActivityForResult(intent, + requestCode); + } + } + @Override public void pushNativeRoute(FlutterBoostRouteOptions options) { - Intent intent = new Intent(FlutterBoost.instance().currentActivity(), NativePageActivity.class); - FlutterBoost.instance().currentActivity().startActivityForResult(intent, options.requestCode()); + Context context = getCurrentContext(); + Intent intent = new Intent(context, NativePageActivity.class); + startActivityForResult(intent, options.requestCode()); } @Override public void pushFlutterRoute(FlutterBoostRouteOptions options) { - Class activityClass = options.opaque() ? FlutterBoostActivity.class : TransparencyPageActivity.class; + Class activityClass = options.opaque() ? + FlutterBoostActivity.class : TransparencyPageActivity.class; Intent intent = new FlutterBoostActivity.CachedEngineIntentBuilder(activityClass) .destroyEngineWithActivity(false) // 注意:这里需要回传dart带过来的uniqueId,否则页面退出时传参可能失败。 // 但,如果是从Native打开Flutter页面,请不要给uniqueId赋*任何值*!!! .uniqueId(options.uniqueId()) - .backgroundMode(options.opaque() ? BackgroundMode.opaque : BackgroundMode.transparent) + .backgroundMode(options.opaque() ? BackgroundMode.opaque : + BackgroundMode.transparent) .url(options.pageName()) .urlParams(options.arguments()) - .build(FlutterBoost.instance().currentActivity()); - FlutterBoost.instance().currentActivity().startActivity(intent); + .build(getCurrentContext()); + startActivityForResult(intent, options.requestCode()); } @Override public boolean popRoute(FlutterBoostRouteOptions options) { //自定义popRoute处理逻辑,如果不想走默认处理逻辑返回true进行拦截 - Toast.makeText(FlutterBoost.instance().currentActivity().getApplicationContext(), "Add customized popRoute handler here", Toast.LENGTH_SHORT).show(); + Toast.makeText(FlutterBoost.instance().currentActivity().getApplicationContext(), "Add " + + "customized popRoute handler here", Toast.LENGTH_SHORT).show(); return false; } } diff --git a/example/lib/tab/simple_widget.dart b/example/lib/tab/simple_widget.dart index f091f47c..e7612ea9 100644 --- a/example/lib/tab/simple_widget.dart +++ b/example/lib/tab/simple_widget.dart @@ -94,7 +94,14 @@ class _SimpleWidgetState extends State 'open native page', style: TextStyle(fontSize: 22.0, color: Colors.black), )), - onTap: () => BoostNavigator.instance.push("native"), + onTap: () => BoostNavigator.instance.push("native").then( + (value) { + if (mounted) { + ScaffoldMessenger.of(context) + ..removeCurrentSnackBar() + ..showSnackBar(SnackBar(content: Text("$value"))); + } + }), ), InkWell( child: Container(