Android 打开FlutterActivity页面白屏问题处
2022-06-22 本文已影响0人
差点长成一枚帅哥
不做任何处理,直接跳转Flutter页面的代码如下(会白屏)
/**
* flutter页面跳转
* @param router 路由页面(比如:home, mine, shop等)
* @param jsonParam 携带参数
*/
public static void go(Context context, String router, String jsonParam){
try {
//路由跳转携带参数
JSONObject params = new JSONObject();
params.put("router", router);
params.put("params", new JSONObject(jsonParam));
//引擎builder,以及传递路由参数
NewEngineIntentBuilder engine = new NewEngineIntentBuilder(MainActivity.class);
engine.initialRoute(params.toString());
//构建intent进行页面跳转
Intent intent = engine.build(context);
context.startActivity(intent);
}catch (Exception e){
e.printStackTrace();
}
}
导致白屏的原因是因为engine
加载耗时,解决这个问题,可以将初始化提前,放在Application
的OnCreate
里面初始化,利用LauncherActivity
的加载时间,提前初始化好Engine,并存储到缓存中,在需要跳转到FlutterActivity
的时候,直接从缓存里面获取engine
即可,代码如下:
第一步:Application中的OnCreate初始化代码
@Override
public void onCreate() {
super.onCreate();
//修复onCreate被执行多次的问题
String processName = DeviceUtils.getProcessName(this);
if (!TextUtils.isEmpty(processName)) {
String pkName = this.getPackageName();
//只有主进程,才执行后续逻辑
if(!processName.equals(pkName)) {
return;
}
}
//初始化flutter引擎
initFlutterEngine();
}
/**
* 初始化flutter引擎
*/
private void initFlutterEngine(){
try {
//获取native中使用的是api环境地址
JSONObject jsonObject = new JSONObject();
jsonObject.put("app_evn", getResources().getInteger(R.integer.app_evn));
//路由地址,以及路由跳转传参
JSONObject params = new JSONObject();
params.put("router", "/");
params.put("params", jsonObject);
//初始化FlutterEngine,设置路由
FlutterEngine engine = new FlutterEngine(this);
engine.getNavigationChannel().setInitialRoute(params.toString());
engine.getDartExecutor().executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());
//保存到缓存,engineId随便写
FlutterEngineCache.getInstance().put("my_engine_id", engine);
}catch (Exception e){
e.printStackTrace();
}
}
第二步:跳转FlutterActivity部分代码
/**
* flutter页面跳转, 根据引擎ID跳转
* @param context
*/
public static void go(Context context, String enginId){
try {
CachedEngineIntentBuilder engine = new CachedEngineIntentBuilder(MainActivity.class, enginId);
Intent intent = engine.build(context);
context.startActivity(intent);
}catch (Exception e){
e.printStackTrace();
}
}
代码虽简单,就当是做个笔记,同时分享给大家吧。