From dd9d72e5e18f452e9db762350fd1d79775b92bff Mon Sep 17 00:00:00 2001 From: "yangwu.jia" <yangwu.jia@taobao.com> Date: Mon, 11 Nov 2019 17:31:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DFLUTTER=5FACTIVITY=5FCREATED?= =?UTF-8?q?=20=E6=A8=A1=E5=BC=8F=E4=B8=8B=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flutterboost/FlutterBoostPlugin.java | 9 +++-- .../flutterboost/NewFlutterBoost.java | 9 +++++ .../containers/FlutterSplashView.java | 38 +++++++++++++++++-- lib/flutter_boost.dart | 21 ++++++++++ 4 files changed, 70 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/com/idlefish/flutterboost/FlutterBoostPlugin.java b/android/src/main/java/com/idlefish/flutterboost/FlutterBoostPlugin.java index 42add68..b3e2cc2 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 9ac4c02..6ea0b31 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 c74382d..de60241 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 9b89677..e9093da 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?'); -- 2.26.2