内容简介:在拿常用的数据持久化的最后看了
在 Flutter
中使用三方插件的时候,很好奇,他是怎么做到,跨平台,既能在iOS上使用,也能在Android上使用?
一探究竟
拿常用的数据持久化的 shared_preferences
来看,他的功能在iOS上和 NSUserDefaults
的功能基本类似, 在安卓上 基本上和 SharedPreferences
一样,
猜想
-
用Flutter 自己的某种方法实现,和Flutter 的界面一样,既不是在iOS中转化成了
UIViewController
也不是在Android中转化成了Activity
, - 和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_preferences
中 setBool
的实现,映射的是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
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》 这本书的介绍吧!