Android 打开FlutterActivity页面白屏问题处理

不做任何处理,直接跳转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加载耗时,解决这个问题,可以将初始化提前,放在ApplicationOnCreate里面初始化,利用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();
        }
    }

代码虽简单,就当是做个笔记,同时分享给大家吧。

你可能感兴趣的:(Android 打开FlutterActivity页面白屏问题处理)