上海网站建设搜q.479185700旅游网站开发近五年参考文献

张小明 2025/12/26 9:04:38
上海网站建设搜q.479185700,旅游网站开发近五年参考文献,上海高新技术企业有哪些,建筑网站 法人签字目录 一、简介 二、核心概念 三、使用步骤 1. 添加依赖 2. 导入包 3. 获取实例 4. 数据操作方法 四、工程化封装 4.1 为什么要封装#xff1f; 4.2 统一键值管理#xff1a;SPKeys 4.3 工具类实现#xff1a;SPUtils 4.4 在项目中使用 4.5 小结 五、总结 一、…目录一、简介二、核心概念三、使用步骤1. 添加依赖2. 导入包3. 获取实例4. 数据操作方法四、工程化封装4.1 为什么要封装4.2 统一键值管理SPKeys4.3 工具类实现SPUtils4.4 在项目中使用4.5 小结五、总结一、简介SharedPreferences是Flutter官方提供的轻量级本地数据存储方案适用于保存用户配置、登录状态、简单设置等键值对Key-Value数据。其底层基于平台原生实现Android 的SharedPreferences和 iOS 的NSUserDefaults具有操作简单、读写高效的特点。二、核心概念特性说明数据类型支持int、double、bool、String、ListString存储位置自动持久化到设备本地数据持久性应用卸载时数据会被清除异步操作所有读写操作均为异步Future跨平台一致性自动适配 Android/iOS/Web/桌面端三、使用步骤1. 添加依赖# pubspec.yaml dependencies: # 存储键值对数据的轻量级解决方案适用于保存用户设置、偏好等小型数据。 shared_preferences: ^2.5.42. 导入包import package:shared_preferences/shared_preferences.dart;3. 获取实例final prefs await SharedPreferences.getInstance();4. 数据操作方法操作类型方法签名示例写入数据setInt(String key, int value)prefs.setInt(age, 25);setDouble(String key, double value)prefs.setDouble(price, 9.99);setBool(String key, bool value)prefs.setBool(isDark, true);setString(String key, String value)prefs.setString(name, Tom);setStringList(String key, ListString value)prefs.setStringList(tags, [a,b]);读取数据get(String key)/getInt()/getBool()等prefs.getInt(age) ?? 0;删除数据remove(String key)prefs.remove(tempData);清空数据clear()prefs.clear();四、工程化封装在 Flutter 开发中shared_preferences(SP) 几乎是每个项目的标配但在实际搬砖过程中如果直接在业务层满大街写SharedPreferences.getInstance()不仅代码显得臃肿后期维护 Key 值更是一场灾难。今天分享一套我在项目中沉淀的 SP 封装方案通过 工具类化 和 常量化实现逻辑解耦。4.1 为什么要封装很多新手喜欢在initState里异步获取 SP 实例这种做法有两个明显的弊端代码重复每个页面都要写一遍异步等待。硬编码prefs.getString(user_token)里的字符串一旦写错一个字母排查起来非常头疼。我们的目标是全局初始化一次到处同步调用Key 值统一管理。4.2 统一键值管理SPKeys首先新建sp_keys.dart我们利用私有构造函数确保 Key 值只在一个地方定义。/// Description: 定义存储键值对的键 /// CreateDate: 2025/12/22 11:31 /// Author: agg class SPKeys { SPKeys._(); // 闭合构造函数防止被实例化 static const String userToken user_token; static const String themeMode theme_mode; static const String userInfo user_info; }4.3 工具类实现SPUtils在sp_utils.dart中我们引入late关键字通过在应用启动时预加载将后续的 IO 操作转化为类似同步的调用。import dart:convert; import package:shared_preferences/shared_preferences.dart; /// /// Description: 存储键值对数据工具类 /// CreateDate: 2025/12/22 9:54 /// Author: agg /// class SPUtils { // 使用 late 关键字如果未初始化就调用会直接报错方便开发者定位 static late SharedPreferences _prefs; /// 初始化在 main.dart 中 await SPUtils.init() static Futurevoid init() async { _prefs await SharedPreferences.getInstance(); } // 核心方法 /// 保存数据 /// 支持 String, int, double, bool, ListString /// 以及可以通过 jsonEncode 转换的 Map 或 Object static Futurebool set(String key, dynamic value) { if (value is String) return _prefs.setString(key, value); if (value is int) return _prefs.setInt(key, value); if (value is bool) return _prefs.setBool(key, value); if (value is double) return _prefs.setDouble(key, value); if (value is ListString) return _prefs.setStringList(key, value); // 如果是 Map 或自定义对象转为 json 字符串存储 return _prefs.setString(key, jsonEncode(value)); } static String getString(String key, {String defaultValue }) { return _prefs.getString(key) ?? defaultValue; } static int getInt(String key, {int defaultValue 0}) { return _prefs.getInt(key) ?? defaultValue; } static bool getBool(String key, {bool defaultValue false}) { return _prefs.getBool(key) ?? defaultValue; } static double getDouble(String key, {double defaultValue 0.0}) { return _prefs.getDouble(key) ?? defaultValue; } static ListString getStringList( String key, { ListString defaultValue const [], }) { return _prefs.getStringList(key) ?? defaultValue; } /// 获取复杂对象 (Map 或 List) /// 读取后需手动转换类型: Map user SPUtils.getObject(user); static dynamic getObject(String key) { String? jsonStr _prefs.getString(key); if (jsonStr null || jsonStr.isEmpty) return null; try { return jsonDecode(jsonStr); } catch (e) { print(SPUtils getObject error: $e); return null; } } // 工具方法 static bool containsKey(String key) _prefs.containsKey(key); static Futurebool remove(String key) _prefs.remove(key); static Futurebool clear() _prefs.clear(); }4.4 在项目中使用入口预装载 在 main.dart 的 main 函数中先确保 Flutter 引擎初始化然后加载 SP。void main() async { // 必须调用确保与原生层交互正常 WidgetsFlutterBinding.ensureInitialized(); // 预装载 SP耗时极短但收益巨大 await SPUtils.init(); runApp(const MyApp()); }业务逻辑层调用 在任何 Widget 或 Controller 里读写数据都不再需要 await 获取实例。// 存储 Token SPUtils.set(SPKeys.userToken, ey...123); // 存储复杂的用户信息 MapString, dynamic user {name: agg, age: 18}; SPUtils.set(SPKeys.userInfo, user); // 获取数据 String token SPUtils.getString(SPKeys.userToken);4.5 小结同步化体验虽然 SP 的原生 API 是异步的但通过在main函数预加载实例我们可以像操作内存变量一样操作本地持久化数据。安全提示由于使用了late如果在init()还没完成时就强行调用读取方法程序会 Crash所以务必在runApp之前完成初始化。选型建议SP 适合存储小体量的配置信息如登录态、主题颜色、引导页状态如果是大批量的结构化数据建议使用Hive或SQFlite。五、总结SharedPreferences是 Flutter 生态中最基础的持久化方案具有上手简单、跨平台兼容的优势适用于存储小型、非敏感的键值对数据。官方文档SharedPreferences API
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

全国企业信用信息查询网站本人做静态网站开发

📦点击查看-已发布目标检测数据集合集(持续更新) 数据集名称图像数量应用方向博客链接🔌 电网巡检检测数据集1600 张电力设备目标检测点击查看🔥 火焰 / 烟雾 / 人检测数据集10000张安防监控,多目标检测点…

张小明 2025/12/26 9:04:04 网站建设

上海做网站最好的公司上海旧房翻新装修哪家好

目录 一、SRTP的诞生背景 二、SRTP的核心架构 三、SRTP的技术优势与挑战 3.1 优势 3.2 挑战 四、结语 在数字通信技术飞速发展的今天,实时音视频传输已渗透至生活与工作的各个角落。从跨国企业的视频会议到在线教育的互动课堂,从远程医疗的精准诊断…

张小明 2025/12/26 9:03:31 网站建设

武冈市住房和城乡建设局网站注册公司名字核名查询系统

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个极简的IntelliJ IDEA中文插件教学项目,要求:1. 只包含最基本的菜单中文化功能 2. 提供step-by-step的代码注释 3. 内置简单易懂的配置说明 4. 包含常…

张小明 2025/12/26 9:02:57 网站建设

广西网站建设教程珠海网站制作价格

本课题针对共享咖啡机运维中设备状态监控滞后、耗材补给不及时、故障处理效率低等问题,设计并实现基于PythonDjango的共享咖啡机运维系统。课题以“实时监控、精准运维、高效管控”为核心目标,依托Python的数据处理与串口通信优势,结合Django…

张小明 2025/12/26 9:02:23 网站建设

找人做效果图去什么网站中文域名注册费用标准

目录一、背景:从 HostBound 说起为什么在昇腾平台上 HostBound 更明显?二、了解 IRQ 与 irqbalance 的机制1. 什么是硬件中断?2. 中断的注册与维护3. irqbalance 的执行逻辑(1)irqbalance 的工作方式(2&…

张小明 2025/12/26 9:01:16 网站建设

深圳网站制作大运软件小镇淘宝上有做网站的吗

13.5 扩散模型:前向过程、反向过程与得分匹配 扩散模型是当前生成式人工智能领域的核心范式之一,其灵感源于非平衡热力学,通过模拟数据在噪声空间中的扩散与逆扩散过程来学习数据分布[reference:0]。本节将系统阐述扩散模型的三个核心组成部分:前向扩散过程、反向生成过程…

张小明 2025/12/26 9:00:42 网站建设