
移动开发跨平台【免费下载链接】pluginsPlugins for Flutter maintained by the Flutter team项目地址https://gitcode.com/gh_mirrors/pl/plugins点击查看免费下载本文基于 Flutter 官方插件仓库gh_mirrors/pl/plugins中shared_preferences_platform_interface包的 CHANGELOG.md系统梳理该平台接口从 1.0.0 首次发布到 2.1.0 的关键演进节点并结合本仓库的源码与测试深入解析SharedPreferencesStorePlatform抽象类的设计哲学、isMock弃用的来龙去脉以及如何基于MockPlatformInterfaceMixin编写现代规范的平台实现与测试。读完本文你将掌握 Flutter federated plugin联邦插件架构下平台接口的兼容性约定、正确扩展示例与迁移实操。一、平台接口包是什么shared_preferences 联邦插件的中枢shared_preferences_platform_interface是shared_preferences插件的公共平台接口包。它位于 Flutter 联邦插件federated plugin架构的中心位置插件本身与各个平台实现Android、iOS、Linux、macOS、Web、Windows都依赖这个包从而保证所有实现遵循同一套接口契约。从本仓库shared_preferences的 pubspec.yaml 可以看到完整的联邦结构flutter: plugin: platforms: android: default_package: shared_preferences_android ios: default_package: shared_preferences_foundation linux: default_package: shared_preferences_linux macos: default_package: shared_preferences_foundation web: default_package: shared_preferences_web windows: default_package: shared_preferences_windows各平台包都显式依赖shared_preferences_platform_interface: ^2.0.0这正是 CHANGELOG 中 2.0.0 版本完成 null safety 迁移后成为所有下游版本基线的原因。接口包的职责集中在两个文件接口包 lib 目录shared_preferences_platform_interface.dart定义抽象类SharedPreferencesStorePlatform及内存实现InMemorySharedPreferencesStoremethod_channel_shared_preferences.dart提供基于 MethodChannel 的默认实现MethodChannelSharedPreferencesStore。二、版本演进全景从 1.0.0 到 2.1.0 的六个关键节点1.0.0接口与方法通道实现的首次发布CHANGELOG 记录 1.0.0 为 Initial release包含两部分内容平台接口本身基于 MethodChannel 的实现。后者即 method_channel_shared_preferences.dart 中的MethodChannelSharedPreferencesStore它通过常量通道plugins.flutter.io/shared_preferences与原生侧通信提供四个核心方法方法MethodChannel 调用说明getAll()getAll返回全部键值对MapString, ObjectsetValue(valueType, key, value)set$valueType按类型写入如setString、setBool、setInt、setDouble、setStringListremove(key)remove删除指定键clear()clear清空存储1.0.1移除弃用的author:字段对应 pubspec 规范演进属于发布元数据的清理不涉及运行时行为。1.0.2新增 macOS 平台包CHANGELOG 明确记录“Adds ashared_preferences_macospackage”。如今 macOS 已并入shared_preferences_foundation与 iOS 共用 Foundation 实现但在当时这是平台覆盖的重要一步说明接口包与平台包是独立演进、按需补充的关系。1.0.3 ~ 1.0.5依赖与约束收尾1.0.3显式声明pedanticdev_dependency统一代码风格检查1.0.4将 Dart 依赖下限提升到 2.1.01.0.5更新 Flutter SDK 约束。这一系列小版本体现了接口包“宁可保守、不可激进”的维护策略——任何 SDK 约束的调整都通过独立版本发布避免对下游造成意外破坏。2.0.0全面迁移至 null safety这是接口包最关键的一次破坏性升级。迁移后所有公开 API 均采用可空类型标注例如FutureMapString, Object getAll()、Futurebool remove(String key)。本仓库pubspec.yaml的当前状态正是迁移完成后的形态environment: sdk: 2.12.0 3.0.0 flutter: 3.0.0 dependencies: flutter: sdk: flutter plugin_platform_interface: ^2.1.02.1.0采用plugin_platform_interfaceisMock退出历史舞台2.1.0 是接口包最重要的架构性更新Adoptsplugin_platform_interface. As a result,isMockis deprecated in favor of the now-standardMockPlatformInterfaceMixin.同时NEXT 版本声明将最低 Flutter 版本提升到 3.0与 pubspec.yaml 中flutter: 3.0.0的约束一致。三、源码级剖析SharedPreferencesStorePlatform的设计哲学3.1 强制extends、禁止implements的 token 校验接口类的核心机制位于 shared_preferences_platform_interface.dartabstract class SharedPreferencesStorePlatform extends PlatformInterface { SharedPreferencesStorePlatform() : super(token: _token); static final Object _token Object(); static SharedPreferencesStorePlatform get instance _instance; static set instance(SharedPreferencesStorePlatform instance) { if (!instance.isMock) { PlatformInterface.verify(instance, _token); } _instance instance; } static SharedPreferencesStorePlatform _instance MethodChannelSharedPreferencesStore(); ... }设计要点构造函数必须携带私有 token_token调用super(token: _token)PlatformInterface.verify会校验传入实例是否真正extends了本类而非implements默认实例是MethodChannelSharedPreferencesStore即未注册任何平台实现时走原生通道。为什么强制extends类文档解释得很清楚平台实现应该extends而非implements本类因为shared_preferences不认为新增方法属于破坏性变更。extends的子类会自动继承新增方法的默认实现而implements的实现类会因为缺少新方法而直接编译失败。这保证了接口可以持续非破坏性地扩展。3.2 四个抽象方法的契约接口暴露四个核心操作接口源码方法签名语义removeFuturebool remove(String key)删除键值返回是否成功setValueFuturebool setValue(String valueType, String key, Object value)按 valueType 写入返回是否成功clearFuturebool clear()清空存储getAllFutureMapString, Object getAll()返回全部键值对setValue的valueType必须与 value 的实际类型严格匹配Bool↔boolDouble↔doubleInt↔intString↔StringStringList↔ListString这一映射在 MethodChannel 实现中直接拼接为方法名method_channel_shared_preferences.dartFuturebool setValue(String valueType, String key, Object value) async { return (await _kChannel.invokeMethodbool( set$valueType, String, dynamic{key: key, value: value}, ))!; }测试也验证了这五个方法的精确映射关系method_channel_shared_preferences_test.dartexpect(log[0].method, setString); expect(log[1].method, setBool); expect(log[2].method, setInt); expect(log[3].method, setDouble); expect(log[4].method, setStringList);3.3 默认实现MethodChannel 与 InMemory 双通道接口包自带两个实现MethodChannelSharedPreferencesStore源码包装 iOS 的NSUserDefaults与 Android 的SharedPreferences数据异步落盘是生产环境的默认实现InMemorySharedPreferencesStore源码纯内存存储数据不跨应用重启持久化专供单元测试使用提供empty()与withData(data)两个构造器。InMemorySharedPreferencesStore在测试中承担“假原生端”的角色——MethodChannel 测试通过setMockMethodCallHandler把通道调用重定向到内存存储测试源码从而无需真实设备即可验证完整的调用链与参数编解码。四、isMock弃用与MockPlatformInterfaceMixin迁移4.1 为什么要弃用isMockisMock是一个为 Mockito 等测试框架提供的“后门”接口源码visibleForTesting Deprecated(Use MockPlatformInterfaceMixin instead) bool get isMock false;问题在于Mockito 生成的 mock 是用implements实现的而implements又恰恰是PlatformInterface.verify要禁止的行为。为了放行 mock旧方案让 mock 覆盖isMock true来跳过校验。这存在两个缺陷任何实现类都可以谎报isMock绕过合规检查每个平台的 mock 都要手工重复实现这套样板逻辑。plugin_platform_interface包后来提供了标准方案MockPlatformInterfaceMixin统一了所有 Flutter 插件的 mock 写法isMock因此被标记为Deprecated。从本仓库 pubspec.yaml 可以看到接口包已依赖plugin_platform_interface: ^2.1.0这正是 mixin 可用的版本基础。4.2 测试如何验证三种实现形态接口包测试 用三个用例覆盖了新旧两种机制的兼容性禁止非法实现IllegalImplementation implements SharedPreferencesStorePlatform且isMock false注册时必然抛出异常throwsA(anything)现代 mock 放行ModernMockImplementation with MockPlatformInterfaceMixin implements SharedPreferencesStorePlatform注册成功——这就是 2.1.0 之后的推荐写法旧版兼容LegacyIsMockImplementation通过isMock true放行——保证已使用旧写法的下游代码在过渡期不损坏。4.3 迁移实操如何编写现代平台 mock迁移到MockPlatformInterfaceMixin只需两步// 迁移前已弃用 class LegacyIsMockImplementation implements SharedPreferencesStorePlatform { override bool get isMock true; // ...四个抽象方法 } // 迁移后推荐 class ModernMockImplementation with MockPlatformInterfaceMixin implements SharedPreferencesStorePlatform { override bool get isMock false; // ...四个抽象方法 }关键差异mix 方式的 mock不需要覆盖isMock它已由 mixin 提供校验通过 mixin 内部的 token 机制完成比手工后门更安全、更统一。五、实战如何实现并注册一个新的平台实现5.1 实现平台 Store 类以仓库中现有平台实现为范本如 shared_preferences_windows、shared_preferences_android 等核心步骤是class MySharedPreferencesStore extends SharedPreferencesStorePlatform { override Futurebool remove(String key) async { // 平台特定的删除逻辑 } override Futurebool setValue(String valueType, String key, Object value) async { // 平台特定的写入逻辑 } override Futurebool clear() async { // 平台特定的清空逻辑 } override FutureMapString, Object getAll() async { // 平台特定的读取逻辑 } }注意必须使用extends通过构造函数把 token 传给super(token: _token)这是PlatformInterface.verify通过的前提。5.2 注册到全局单例平台插件的注册入口统一是设置SharedPreferencesStorePlatform.instance。本仓库所有平台包均遵循此模式例如 Windows 实现shared_preferences_windows.dartSharedPreferencesStorePlatform.instance SharedPreferencesWindows();同类注册散见于 Android、FoundationiOS/macOS、Linux、Web 等实现本仓库可检索到全部注册点。注册之后SharedPreferences的所有读写操作都会路由到该实现。5.3 单元测试接入需要测试上层逻辑时直接用InMemorySharedPreferencesStore.empty()替换实例即可无需任何原生环境需要测试原生通道时参照 method_channel_shared_preferences_test.dart 用setMockMethodCallHandler模拟通道需要 mock 接口本身时按 4.3 节使用MockPlatformInterfaceMixin。六、兼容性约定与升级指南6.1 非破坏性变更优先接口包 README 明确声明README.mdStrongly prefer non-breaking changes (such as adding a method to the interface) over breaking changes for this package.也就是说向接口新增方法是推荐的非破坏性演进方式——因为所有合规实现都基于extends新方法会被默认实现自动覆盖。只有改动已有方法签名、删除方法等才属于破坏性变更需要走 major 版本。6.2 从旧版本升级的检查清单场景操作使用isMock的测试代码迁移到MockPlatformInterfaceMixinimplements的非 mock 实现类改为extends SharedPreferencesStorePlatform依赖版本 2.0.0先升级到 2.x 完成 null safety 迁移Flutter 版本 3.0升级 Flutter 至 ≥3.0NEXT 版本要求七、小结shared_preferences_platform_interface的演进史是 Flutter 联邦插件生态规范化的缩影1.0.0确立了接口 MethodChannel 默认实现的基本架构2.0.0完成 null safety 迁移2.1.0采纳plugin_platform_interface用标准的MockPlatformInterfaceMixin取代自研的isMock后门。对开发者而言理解这套接口的意义在于无论你是在为shared_preferences编写新的平台实现还是在自己的测试中 mock 存储层只要遵守“extends而非implements、用 mixin 而非isMock”这两条规则就能与官方生态保持同步并享受接口持续非破坏性演进的长期红利。赞分享移动开发跨平台【免费下载链接】pluginsPlugins for Flutter maintained by the Flutter team项目地址https://gitcode.com/gh_mirrors/pl/plugins点击查看免费下载相关推荐shared_preferences 演进全史从 0.1.0 到 2.5.5 的 API 架构、平台联邦化与迁移实践shared_preferences 演进全史从 0.1.0 到 2.5.5 的 API 架构、平台联邦化与迁移实践 本篇文章以 shared_prefere跨平台移动开发UI组件开发工具video_spider技术演进从单一平台到23个平台的全覆盖之路video_spider技术演进从单一平台到23个平台的全覆盖之路 短视频已经成为现代人日常生活中不可或缺的一部分但平台水印却常常影响视频的观看体验。网页爬虫后端webview_flutter_platform_interface 演进全览从 1.0.0 到 2.15.1 的平台接口变更指南webview_flutter_platform_interface 演进全览从 1.0.0 到 2.15.1 的平台接口变更指南 webview_flutt跨平台移动开发UI组件开发工具上一篇LaVague核心架构深度剖析从World Model到Action Engine下一篇揭秘Gearboy调试器如何利用内存编辑器和VRAM查看器优化游戏体验 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考