Flutter shared_preferences 探究

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

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

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

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

查看所有标签

猜你喜欢:

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

Linux Device Drivers

Linux Device Drivers

Jonathan Corbet、Alessandro Rubini、Greg Kroah-Hartman / O'Reilly Media / 2005-2-17 / USD 39.95

Device drivers literally drive everything you're interested in--disks, monitors, keyboards, modems--everything outside the computer chip and memory. And writing device drivers is one of the few areas ......一起来看看 《Linux Device Drivers》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具