diff --git a/android/src/main/java/com/idlefish/flutterboost/FlutterBoostPlugin.java b/android/src/main/java/com/idlefish/flutterboost/FlutterBoostPlugin.java index 42add68e8eae5f6473996b2521072d5575f4d708..b3e2cc293e5e37eb6e6439c8222c5a60e6a8381f 100644 --- a/android/src/main/java/com/idlefish/flutterboost/FlutterBoostPlugin.java +++ b/android/src/main/java/com/idlefish/flutterboost/FlutterBoostPlugin.java @@ -1,14 +1,12 @@ package com.idlefish.flutterboost; +import android.os.Handler; import android.support.annotation.Nullable; import com.idlefish.flutterboost.interfaces.IContainerRecord; import java.io.Serializable; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; @@ -217,6 +215,9 @@ public class FlutterBoostPlugin { } result.success(pageInfo); + NewFlutterBoost.instance().setFlutterPostFrameCallTime(new Date().getTime()); + + } catch (Throwable t) { result.error("no flutter page found!", t.getMessage(), t); } diff --git a/android/src/main/java/com/idlefish/flutterboost/NewFlutterBoost.java b/android/src/main/java/com/idlefish/flutterboost/NewFlutterBoost.java index 9ac4c02e7eaa64562cf9bde04caca96b0e548eea..6ea0b31a9710e0f1996173539fd787ce9b719341 100644 --- a/android/src/main/java/com/idlefish/flutterboost/NewFlutterBoost.java +++ b/android/src/main/java/com/idlefish/flutterboost/NewFlutterBoost.java @@ -31,6 +31,15 @@ public class NewFlutterBoost { private PluginRegistry mRegistry; static NewFlutterBoost sInstance = null; + private long FlutterPostFrameCallTime=0; + + public long getFlutterPostFrameCallTime(){ + return FlutterPostFrameCallTime; + } + + public void setFlutterPostFrameCallTime(long FlutterPostFrameCallTime){ + this.FlutterPostFrameCallTime=FlutterPostFrameCallTime; + } public static NewFlutterBoost instance() { if (sInstance == null) { sInstance = new NewFlutterBoost(); diff --git a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterSplashView.java b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterSplashView.java index c74382d4878a2ae1523676c43c949e6ed6090dca..de602416546556c5a50717336d72a3aa7ea440be 100644 --- a/android/src/main/java/com/idlefish/flutterboost/containers/FlutterSplashView.java +++ b/android/src/main/java/com/idlefish/flutterboost/containers/FlutterSplashView.java @@ -3,6 +3,7 @@ package com.idlefish.flutterboost.containers; import android.content.Context; import android.graphics.Color; import android.os.Bundle; +import android.os.Handler; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; @@ -18,6 +19,8 @@ import io.flutter.embedding.android.SplashScreen; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.embedding.engine.renderer.OnFirstFrameRenderedListener; +import java.util.Date; + /** * {@code View} that displays a {@link SplashScreen} until a given {@link FlutterView} * renders its first frame. @@ -39,7 +42,7 @@ public class FlutterSplashView extends FrameLayout { @Nullable private String previousCompletedSplashIsolate; - private boolean hasRendered=false; + private Handler handler = new Handler(); @NonNull private final FlutterView.FlutterEngineAttachmentListener flutterEngineAttachmentListener = new FlutterView.FlutterEngineAttachmentListener() { @@ -57,11 +60,40 @@ public class FlutterSplashView extends FrameLayout { @NonNull private final OnFirstFrameRenderedListener onFirstFrameRenderedListener = new OnFirstFrameRenderedListener() { + int i=0; @Override public void onFirstFrameRendered() { - if (splashScreen != null) { - transitionToFlutter(); + + if(NewFlutterBoost.instance().platform().whenEngineStart()== NewFlutterBoost.ConfigBuilder.FLUTTER_ACTIVITY_CREATED){ + long now=new Date().getTime(); + long flutterPostFrameCallTime=NewFlutterBoost.instance().getFlutterPostFrameCallTime(); + + if(flutterPostFrameCallTime!=0&& (now-flutterPostFrameCallTime)>800){ + if (splashScreen != null) { + transitionToFlutter(); + } + return; + } + + handler.postDelayed(new Runnable() { + @Override + public void run() { + onFirstFrameRenderedListener.onFirstFrameRendered(); + } + }, 200); + + + }else{ + if (splashScreen != null) { + transitionToFlutter(); + } } + + + + + + } }; diff --git a/lib/flutter_boost.dart b/lib/flutter_boost.dart index 9b89677f38de791a81ff16a63e52ad64a0aeeeb7..e9093da18680e2f862f89f691f059d74e7982604 100755 --- a/lib/flutter_boost.dart +++ b/lib/flutter_boost.dart @@ -22,6 +22,7 @@ * THE SOFTWARE. */ import 'dart:async'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'container/boost_container.dart'; @@ -60,6 +61,26 @@ class FlutterBoost { PrePushRoute prePush, PostPushRoute postPush}) { + if(Platform.isAndroid){ + + WidgetsBinding.instance.addPostFrameCallback((_){ + + singleton.channel.invokeMethod<Map>('pageOnStart').then((Map pageInfo){ + + if (pageInfo == null || pageInfo.isEmpty) return; + + if (pageInfo.containsKey("name") && + pageInfo.containsKey("params") && + pageInfo.containsKey("uniqueId")) { + + ContainerCoordinator.singleton.nativeContainerDidShow( + pageInfo["name"], pageInfo["params"], pageInfo["uniqueId"]); + } + }); + }); + } + + return (BuildContext context, Widget child) { assert(child is Navigator, 'child must be Navigator, what is wrong?');