现实类比:公司打印机

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

  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.pswp.cn/pingmian/89777.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89777.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/89777.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣刷题 -- 965.单值二叉树

题目示例&#xff1a; 思路分析代码实现 bool isUnivalTree(struct TreeNode* root) {if(rootNULL){return true;}if(root->left && root->val ! root->left->val){return false;}if(root->right && root->val ! root->right->val){re…

uni-api交互反馈组件(showToast)的用法

欢迎来到我的UniApp技术专栏&#xff01;&#x1f389; 在这里&#xff0c;我将与大家分享关于UniApp开发的实用技巧、最佳实践和项目经验。 专栏特色&#xff1a; &#x1f4f1; 跨平台开发一站式解决方案 &#x1f680; 从入门到精通的完整学习路径 &#x1f4a1; 实战项目经…

借助它,在Web3投资赛道抢占先机

随着互联网技术的飞速发展&#xff0c;Web3的概念逐渐成为科技圈和投资界的热门话题。Web3代表着下一代互联网的发展方向&#xff0c;它强调去中心化、用户主权和数据隐私保护。在这一新兴领域&#xff0c;如何借助Web3技术抢占投资先机&#xff0c;成为许多投资者关注的焦点。…

验证大语言模型不会算数但可以编写算数的程序

摘要&#xff1a;本文通过几个实例测试了大语言模型在数学计算、排序、统计等方面的能力。结果显示&#xff0c;对于简单字符统计、排序等任务&#xff0c;大模型能正确生成实现代码&#xff0c;但当数据区分度降低时容易出错。在计算学生分数排名任务中&#xff0c;大模型生成…

概率论与数理统计(八)

参数估计 通过取样本&#xff0c;并用样本构造函数&#xff0c;达成估计分布函数参数的目的 矩估计法 本质&#xff1a;用样本的各阶矩代替总体的各阶矩&#xff0c;即取&#xff1a; E(X)X‾1n∑iXiE(X2)1n∑iXi2E(X)\overline{X}\dfrac{1}{n}\sum_i X_i\\ E(X^2)\dfrac{1}…

服务器后台崩溃的原因

当我们双十一活动零点拼命刷新却卡在支付完页面&#xff0c;游戏页面等不进去&#xff0c;公司系统瘫痪全体员工干瞪眼&#xff0c;服务器崩溃绝对是数字时代中的酷刑&#xff01;那服务器为什么会说崩就崩&#xff0c;用户对于这种情况该如何进行避雷呢&#xff1f;服务器主要…

线程池与ThreadPoolExecutor源码解析(上)

一、线程池线程池&#xff08;ThreadPool&#xff09;是一种线程复用的机制。它维护着若干个线程&#xff0c;任务来了就复用这些线程去执行&#xff0c;任务做完线程不会销毁&#xff0c;而是回到池中等待下一个任务。为什么要用线程池&#xff1f;降低资源消耗&#xff1a;避…

Linux内核IP分片重组机制剖析:高效与安全的艺术

在IP网络通信中,当数据包超过MTU限制时,路由器会将其拆分为多个分片。这些分片到达目标主机后,内核必须高效、安全地重组原始数据包。Linux内核的net/ipv4/inet_fragment.c实现了一套精妙的分片管理框架,完美平衡了性能和安全性需求。本文将深入剖析其设计哲学与关键技术。…

相机模型和对极几何

一、相机模型 1.针孔相机模型-外参矩阵 1.世界坐标系到相机坐标系 世界坐标系&#xff1a;可以定义空间中任意一个位置&#xff0c;原点位置三个坐标轴方向坐标系姿态&#xff08;X,Y,Z&#xff09;相机坐标系&#xff1a;定义在相机上&#xff0c;原点是相机中心&#xff0c;z…

Git 常用命令与操作步骤

以下是 Git 常用命令与操作步骤 的整理&#xff0c;涵盖日常开发中最核心的场景&#xff0c;适合快速查阅和上手&#xff1a;1. 初始化与克隆仓库操作命令本地初始化仓库git init克隆远程仓库git clone <仓库URL> &#xff08;如 git clone https://gitlab.com/user/repo…

Leetcode-.283移动零

class Solution:def moveZeroes(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""pos0for i in range(len(nums)):if nums[i]!0:nums[pos],nums[i]nums[i],nums[pos]pos1本题运用双指针来写&…

在React中做过哪些性能优化?

1. 使用 React.memo 进行组件优化 问题:当父组件重新渲染时,子组件也会重新渲染,即使它的 props 没有变化。 解决方案:使用 React.memo 包裹子组件,让其只在 props 变化时才重新渲染。 const MyComponent = React.memo((props) => {// 子组件代码 }); 2. 使用 useCa…

安装docker可视化工具 Portainer中文版(ubuntu上演示,所有docker通用) 支持控制各种容器,容器操作简单化 降低容器门槛

以下有免费的4090云主机提供ubuntu22.04系统的其他入门实践操作 地址&#xff1a;星宇科技 | GPU服务器 高性能云主机 云服务器-登录 相关兑换码星宇社区---4090算力卡免费体验、共享开发社区-CSDN博客 兑换码要是过期了&#xff0c;可以私信我获取最新兑换码&#xff01;&a…

ansible批量部署zabbix客户端

✅ansible编写剧本步骤 1️⃣创建roles目录结构2️⃣在group_vars/all/main.yml中定义变量列表3️⃣在tasks目录下编写tasks任务4️⃣在files目录下准备部署文件5️⃣在templates目录下创建j2模板文件6️⃣在handlers目录下编写handlers7️⃣在roles目录下编写主playbook8️⃣运…

蚂蚁数科AI数据产业基地正式投产,携手苏州推进AI产业落地

近日&#xff0c;蚂蚁数科AI数据产业基地在太仓智汇谷科技创新园正式投产。该基地作为苏州市首个AI数据产业基地&#xff0c;旨在通过跨行业人才与前沿技术&#xff0c;为长三角制造业、金融、医疗等领域的大模型落地提供场景化、高质量的训练数据支撑。数据被视为AI学习的核心…

计算机的网络体系及协议模型介绍

目录 1、网络协议介绍 1.1、定义 1.2、基本作用 1.3、协议的主要内容 2、网络协议分层 2.1、协议分层原因 2.2、网络协议分层的缺点 2.3、OSI协议和TCP/IP协议的联系 3、TCP/IP 协议族 3.1、定义介绍 3.2、组成 1、应用层 2、运输层 3、网络层 3.3、底层流程 4、…

密码管理安全防御

密码管理是信息安全的核心环节,其目标是通过规范密码的生成、存储、传输、验证和生命周期管理,防止未授权访问,保护用户账号和系统资源的安全。以下从核心原则、技术实践、常见问题及解决方案等方面详细说明: 一、密码管理的核心原则 密码管理需遵循“安全性”与“可用性…

Java异步日志系统性能优化实践指南:基于Log4j2异步Appender与Disruptor

Java异步日志系统性能优化实践指南&#xff1a;基于Log4j2异步Appender与Disruptor 一、技术背景与应用场景 在高并发的后端应用中&#xff0c;日志记录往往成为性能瓶颈之一。同步写日志会阻塞业务线程&#xff0c;导致响应延迟&#xff1b;而简单的异步队列实现又可能出现积压…

Mybatis07-缓存

一、缓存机制的原理计算机每次从mysql中执行sql语句&#xff0c;都是内存与硬盘的通信&#xff0c;对计算机来说&#xff0c;影响效率。因此使用缓存机制。1-1、MyBatis 的缓存机制&#xff1a;执行 DQL&#xff08;select 语句&#xff09;的时候&#xff0c;将查询结果放到缓…

【机器学习深度学习】LoRA 与 QLoRA:大模型高效微调的进阶指南

目录 前言 一、LoRA&#xff1a;低秩微调的经典之作 二、QLoRA&#xff1a;效率与精度的升级版 三、LoRA vs QLoRA&#xff1a;如何选择&#xff1f; 3.1 性能维度对比 3.2 根据「显卡资源」选择 3.3 根据「任务类型与目标」选择 3.4 根据「模型规模」选择 3.5 根据…