美文网首页
Flutter 中三方库实现原理

Flutter 中三方库实现原理

作者: 我不是小白是真白 | 来源:发表于2019-04-24 11:11 被阅读0次

    起因

    Flutter 中使用三方插件的时候,很好奇,他是怎么做到,跨平台,既能在iOS上使用,也能在Android上使用?

    一探究竟

    拿常用的数据持久化的 shared_preferences 来看,他的功能在iOS上和 NSUserDefaults 的功能基本类似, 在安卓上 基本上和 SharedPreferences 一样,

    猜想

    1. 用Flutter 自己的某种方法实现,和Flutter 的界面一样,既不是在iOS中转化成了 UIViewController 也不是在Android中转化成了 Activity,
    2. 和RN一样,在iOS上调用了iOS的实现,在安卓上调用了安卓的实现,

    结果

    最后看了 shared_preferences 的源码,发现,shared_preferences 是基于通道, 在iOS上 和 android 有不同的实现,和猜想二一样,在 iOS 上使用了 NSUserDefaults 安卓使用了 SharedPreferences

    iOS的实现

    通道, 以库的名称为通道名,注册了一个 FlutterMethodChannel

    FlutterMethodChannel *channel = [FlutterMethodChannel methodChannelWithName:CHANNEL_NAME
                                                                  binaryMessenger:registrar.messenger];
    

    在iOS 中 通过通道的 result 将结果返回,这里摘出一小部分,就可以理解,这里 摘出的是 shared_preferencessetBool 的实现,映射的是iOS 中的

     [[NSUserDefaults standardUserDefaults] setBool:value.boolValue forKey:key];
    

    摘出的部分如下:

     else if ([method isEqualToString:@"setBool"]) {
          NSString *key = arguments[@"key"];
          NSNumber *value = arguments[@"value"];
          [[NSUserDefaults standardUserDefaults] setBool:value.boolValue forKey:key];
          result(@YES);
        } else if ([method isEqualToString:@"setInt"]) {
          NSString *key = arguments[@"key"];
          NSNumber *value = arguments[@"value"];
         
          [[NSUserDefaults standardUserDefaults] setValue:value forKey:key];
          result(@YES);
    

    android的实现

    android 和 iOS 的实现基本类似, 首先也是注册通道,然后 映射到安卓的 SharedPreferences 来实现

    通道- 主要代码

     MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL_NAME);
        SharedPreferencesPlugin instance = new SharedPreferencesPlugin(registrar.context());
        channel.setMethodCallHandler(instance);
    

    对应的实现
    这里也摘出 部分, Flutter 中的 shared_preferences 的setBool 对应 android 的

    status = preferences.edit().putBoolean(key, (boolean) call.argument("value")).commit();
    

    摘出的内容如下

    switch (call.method) {
            case "setBool":
              status = preferences.edit().putBoolean(key, (boolean) call.argument("value")).commit();
              break;
            case "setDouble":
              double doubleValue = ((Number) call.argument("value")).doubleValue();
              String doubleValueStr = Double.toString(doubleValue);
              status = preferences.edit().putString(key, DOUBLE_PREFIX + doubleValueStr).commit();
              break;
    

    相关文章

      网友评论

          本文标题:Flutter 中三方库实现原理

          本文链接:https://www.haomeiwen.com/subject/zubwgqtx.html