Flutter shared_preferences 探究

栏目: IOS · 发布时间: 6年前

内容简介:在拿常用的数据持久化的最后看了

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;
复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

绝对价值

绝对价值

[美] 伊塔马尔·西蒙森 艾曼纽·罗森 / 钱峰 / 中国友谊出版公司 / 2014-7 / 45.00元

绝对价值指的是经用户体验的产品质量,即使用某件产品或者享受某项服务的切实感受。 过去,消费就像是押宝。一件商品好不好,一家餐馆的环境如何,没有亲身体验过消费者无从得知,只能根据营销人员提供的有限信息去猜测。品牌、原产地、价位、广告,这些重要的质量线索左右着消费者的选择。 然而,互联网和新兴科技以一种前所未有的速度改变了商业环境。当消费者可以在购买前查看到交易记录和消费者评价,通过便捷的......一起来看看 《绝对价值》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具