当前位置: 首页 > news >正文

Flutter基础(前端教程①③-单例)

现实类比:公司打印机

假设你们公司有一台共享打印机:

  1. 非单例(重复创建)

    • 每个员工都自己买一台打印机放在工位上
    • 结果:浪费钱,占空间,难维护
  2. 单例(唯一实例)

    • 全公司只买一台打印机,放在公共区域
    • 所有人都用这台打印机
    • 结果:省钱,省空间,统一管理

代码中的单例

在 Flutter 中,如果不使用单例,每次调用 new Calculator() 都会创建一个新的计算器:

// 非单例:创建多个计算器实例
final calc1 = new Calculator();
final calc2 = new Calculator();print(calc1 == calc2); // false,两个不同的实例

而使用 Get.put() 注册的对象默认是单例,无论获取多少次都是同一个实例:

// 单例:只创建一个计算器实例
Get.put(Calculator());final calc1 = Get.find<Calculator>();
final calc2 = Get.find<Calculator>();print(calc1 == calc2); // true,同一个实例

为什么需要单例?

  1. 节省资源
    比如网络请求控制器、数据库连接、配置信息等,创建多个实例会浪费内存。

  2. 数据一致性
    所有地方都使用同一个实例,保证数据状态统一。
    (比如用户登录状态、购物车数据)

  3. 避免冲突
    某些类只能有一个实例(如打印机、文件系统),否则会引发冲突。

1. Get.put()

功能:把一个对象「注册」到 GetX 的全局容器中,让它在整个应用里都能被访问。
类比:把工具放进「公共工具箱」,其他人随时可以取。
特点:默认创建单例(全局唯一实例)。

// 创建并注册一个控制器(放入工具箱)
Get.put(PostController());// 在其他地方获取已注册的控制器
final controller = Get.find<PostController>();

2. Get.find()

功能:从 GetX 的全局容器中「获取」已注册的对象。
类比:从「公共工具箱」里取出需要的工具。
注意:必须先 Get.put() 注册,才能 Get.find() 获取。

// 获取已注册的控制器(从工具箱取工具)
final controller = Get.find<PostController>();// 使用控制器的方法
controller.fetchPosts();

3. Get.snackbar()

功能:显示一个顶部或底部的消息提示(类似 Toast 或 Snackbar)。
类比:在屏幕上弹一个「临时通知」。
特点:支持自定义样式、持续时间、点击事件等。

// 显示一个简单的消息提示
Get.snackbar('标题',          // 标题'这是消息内容',  // 内容duration: Duration(seconds: 3),  // 显示3秒snackPosition: SnackPosition.BOTTOM,  // 显示在底部
);

完整示例

// 1. 注册控制器(通常在页面初始化时)
Get.put(PostController());// 2. 获取控制器并调用方法
final controller = Get.find<PostController>();
controller.fetchPosts();    //PostController是class fetchPosts是方法// 3. 在合适的时机显示消息提示(如点击按钮后)
Get.snackbar('加载完成','已成功获取 ${controller.posts.length} 条数据',snackPosition: SnackPosition.TOP,
);

http://www.dtcms.com/a/287233.html

相关文章:

  • 定时器与间歇函数
  • Web3.0与元宇宙:区块链驱动的数字新生态解析
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - snowNLP库实现中文情感分析
  • 如何增强LLM(大语言模型)的“置信度”和“自信心” :LLM的“自信”不是“什么都能答”,而是“该答的答得准,不该答的敢说不”。
  • 【unity游戏开发入门到精通——3D篇】3D光源之——unity使用Lens Flare (SRP) 组件实现太阳耀斑镜头光晕效果
  • 《Origin画百图》之多分类矩阵散点图
  • 2025最新版 Go语言Goland 专业安装及配置(超详细)
  • 华为仓颉编程语言语法简介与示例
  • 从0开始学习R语言--Day51--PH检验
  • 操作系统-分布式同步
  • 【REACT18.x】creat-react-app在添加eslint时报错Environment key “jest/globals“ is unknown
  • Spring AI 项目实战(十九):Spring Boot + AI + Vue3 + OSS + DashScope 构建多模态视觉理解平台(附完整源码)
  • 在 .NET Core 中创建 Web Socket API
  • Redis 如何保证高并发与高可用
  • Elasticsearch 重命名索引
  • OllyDbg技巧学习
  • Go-Redis × 向量检索实战用 HNSW 在 Redis 中索引与查询文本 Embedding(Hash JSON 双版本)
  • 子线程不能直接 new Handler(),而主线程可以
  • LLM大模型微调技术与最佳实践
  • C语言:20250719笔记
  • 目标检测中的标签分配算法总结
  • 【OD机试】停车场收费
  • OpenCV特征点提取算法orb、surf、sift对比
  • Netty网络聊天室及扩展序列化算法
  • 2025年睿抗机器人开发者大赛CAIP-编程技能赛(省赛)-RoboCom 世界机器人开发者大赛-本科组
  • 微软原版系统下载的几个好用网站
  • LVS——nat模式
  • 【ArcGIS技巧】最近分享的GIS插件总结与优化
  • 实战分享:Web3 前端开发Defi项目
  • 【设计模式C#】外观模式(用于解决客户端对系统的许多类进行频繁沟通)