FlutterFlutter

聊聊Flutter Platform SDK

2019-02-21  本文已影响70人  Flutter编程指南

[TOC]

前言

​ 从Flutter的架构图中可以看出,Flutter Platform SDK处于整个Flutter框架的上层,连接了Java与Dart代码。那么作为“最上层”的它,到底扮演了哪些角色,以及是如何扮演好这些角色的呢?Google工程师用一个封装好的flutter.jar包"show me the answer"。

Platform SDK 的角色扮演

​ 通过对Platform SDK(以下简称 Platform)源码的阅读,可以大致将它分成三个角色:Creator(创建者),Transmitter(传递者),Registrant(注册人)。

Creator

创建者

FlutterMain
时序图
flutter_seq.png

FlutterMain担任着flutter的初始化工作,在被Application的onCreate调起后

FlutterActivityDelegate

WhatDelegate
//FlutterActivity.java
......
private final FlutterActivityEvents eventDelegate;
private final Provider viewProvider;
private final PluginRegistry pluginRegistry;   
private final FlutterActivityDelegate delegate = new FlutterActivityDelegate(this, this);
......
public FlutterActivity() {
        this.eventDelegate = this.delegate;
        this.viewProvider = this.delegate;
        this.pluginRegistry = this.delegate;
    }
......

我们可以从上面FlutterActivity的构造函数中看出Delegate到底代理了哪些职责

flutter内聚.png

FlutterView

可以先简单的把FlutterView看成是负责显示的,而把后面的FlutterNativeView看成是负责通信的。

1655b109f83bea9b.png

FlutterNativeView

可以先简单的把FlutterNativeView看成是负责通信的。它在系统层面上实现了BinaryMessenger接口 [这在下文Transmitter中详细介绍]。

Transmitter

传递者

消息渠道

channel.png

消息编解码

​ 标准平台通道使用一个标准的消息编解码器。简单的JSON类值(如布尔值)的高效二进制序列化,数字、字符串、字节缓冲区以及这些列表和映射。(查看细节 StandardMessageCodec)。这些值的序列化和反序列化在消息发送和接收值时自动发生。(对应的数据转化关系如下)

解码.jpg

传递流程

​ 通过Flutter Engine的数据转换,使得Dart和Android之间可以进行通信

channel流程图.png

Registrant

注册人

情境转换

​ 首先这里有三个形似得英文单词registry, registrar and registrant分别对应注册局,注册商和注册人。把它们翻译到现实的生活场景中的角色其实是一个“注册人通过注册商,更新注册信息后,注册商把信息传递给注册局进行保存”的过程。下面我们把这个过程再翻译回代码:

首先我们新建一个plugin插件,作为说明的对象:

// 实现 PluginRegistry.ActivityResultListener
public class FlutterMusicPlugin implements MethodCallHandler, PluginRegistry.ActivityResultListener {
    ...
    public static void registerWith(Registrar registrar) {
        //传入Activity
        final FlutterMusicPlugin plugin = new FlutterMusicPlugin(registrar.activity());
        ...
        // 注册ActivityResult回调
        registrar.addActivityResultListener(plugin);
    }
    
    @Override
    public void onMethodCall(MethodCall call, Result result) {
           ...
    }
    
    @Override
    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
           ...
        return false;
    }
}

同时在GeneratedPluginRegistrant类中会自动生成

public final class GeneratedPluginRegistrant {
  public static void registerWith(PluginRegistry registry) {
    if (alreadyRegisteredWith(registry)) {
      return;
    }
 FlutterMusicPlugin.registerWith(registry.registrarFor("com.plugin.FlutterMusicPlugin"));
  }

  private static boolean alreadyRegisteredWith(PluginRegistry registry) {
    final String key = GeneratedPluginRegistrant.class.getCanonicalName();
    if (registry.hasPlugin(key)) {
      return true;
    }
    registry.registrarFor(key);
    return false;
  }
}

注册人

​ 它对应的是代码中的GeneratedPluginRegistrant类

注册商

​ 它对应的是代码中的FlutterPluginRegistry内部类FlutterRegistrar。

​ 不看不知道,"注册商"其实给我们提供了很多功能,比如获取activity,viewDestory的生命周期的回调,获取surfaceTexture等等,真是一个能力强大的"注册商"。

      
        Activity activity();//返回 Host app的Activity
        Context context();//返回 Application Context.
        Context activeContext();//返回 活动Context
        //返回 BinaryMessenger 主要用来注册Platform channels
        BinaryMessenger messenger();
        //返回 TextureRegistry,从里面可以拿到SurfaceTexture 
        TextureRegistry textures();
        //返回 当前Host app创建的FlutterView
        FlutterView view();
        //返回Asset对应的文件路径
        String lookupKeyForAsset(String var1);
        //返回Asset对应的文件路径
        String lookupKeyForAsset(String var1, String var2);
        //插件对外发布的一个"值"
        PluginRegistry.Registrar publish(Object var1);
        //注册权限相关的回调
        PluginRegistry.Registrar addRequestPermissionsResultListener(PluginRegistry.RequestPermissionsResultListener var1);
        //注册ActivityResult回调
        PluginRegistry.Registrar addActivityResultListener(PluginRegistry.ActivityResultListener var1);
        //注册NewIntent回调
        PluginRegistry.Registrar addNewIntentListener(PluginRegistry.NewIntentListener var1);
        //注册UserLeaveHint回调
        PluginRegistry.Registrar addUserLeaveHintListener(PluginRegistry.UserLeaveHintListener var1);
        //注册View销毁回调
        PluginRegistry.Registrar addViewDestroyListener(PluginRegistry.ViewDestroyListener var1);

注册局

​ 它对应的是代码中的FlutterPluginRegistry

pluginregister.png

从成员变量可以看出FlutterPluginRegistry主要维护两类信息:

  1. 注册插件唯一标识信息汇总
  2. FlutterRegistrar所开放的那些功能(比如:addActivityResultListener)的信息汇总
上一篇 下一篇

猜你喜欢

热点阅读