[Flutter GetX使用] Getx路由和状态管理-GetController使用过程中的踩坑记录

文章目录

  • 问题 - Get.find() 报错!
  • 原因总结
  • A:路由和控制器设计
    • a1:项目中的Get路由
      • aa1.项目路由结构
      • aa2.本项目路由的注意点:
  • B: GetController的冷知识
  • C: 总结来看
  • D: 一些参考资料

问题 - Get.find() 报错!

刚接触Getx, 遇到 Get.find()确找不到, 进而报错的问题, 一时间有点没有头绪…

"HomeController" not found. You need to call "Get.put(HomeController())" or "Get.lazyPut(()=>HomeController())"

"HomeController" not found. You need to call "Get.put(HomeController())" or "Get.lazyPut(()=>HomeController())"

原因总结

不废话, 先总结下 not found 的原因(如果不全,那就后面补全)

  • 1.在Get.find()之前, 确实没有进行 Get.put注入或者 lazyPut

  • 2.通过路由/Binding等进行GetController注入时, 忘记在路由中挂载对应Binding
    在这里插入图片描述

  • 3.在上面两条的基础上,还是无法Get.find(), 就要考虑是否由于 调用Get.offName()/Get.offAllNamed()导致的,
    上一个路由会被这两个函数移除,就导致对应注入的GetController全都被卸载了!!

    在这里插入图片描述

OK 正文完结 哈哈
后面是我个人的项目踩坑记录, 可看可不看~~


A:路由和控制器设计

  1. 关于控制器: 一次注入(懒注入), 处处 Get.find() / Get.find<XxxController>()

(任何页面/widget中,想用到GetController, 就直接Get.find()多舒服,
如果是用到了,再去临时注入(Get.put(),情感上接受不了…)

  1. 关于路由: 比如跳转登录页, 登录后再返回的路由操作, 要体现登录页的类似栈切换感觉

或者说,各个页面在检测登录进行路由跳转的时候, 返回时重置到路由首页(项目要求),而不是直接back返回上一页, 还出现个返回按钮

a1:项目中的Get路由

aa1.项目路由结构

本项目结构不复杂.大概如图
在这里插入图片描述

aa2.本项目路由的注意点:

  1. Main作为初始路由,初始化时即被加载进路由栈

加载进路由,就会触发 在这里插入图片描述

在这里插入图片描述
此时, 作为Main的对应状态管理控制器 MainController就已经被 lazyPut. 可以在当前路由栈里随意 Get.find()

  1. Main页面通过PageView.builder加载了 Home/Prictise/Vidoe/My等四个Widget,这意味着 这四个频道页面, 并不是通过路由跳转(Get.toNamed)的方式展示的, 仅仅是作为子视图而已

通过上面的路由加载过程, 可以看到如果 Home/Prictise/Vidoe/My等四个频道页,如果没有进过路由方式进入, 那他们对应的Binding/GetController,就不会被进行bindinglayzPut
此时,你去进行 Get.find() or Get.find<HomeController>() 一定是 not found的.
这就是属于上头正文里面说的第一中情况
在这里插入图片描述

  1. 注意路由列表中的路由, 不是一次性全都加载的, 而是通过Get.toNamed()等函数触发路由切换后加载

那么, Home/Prictise/Vidoe/My四个频道页面既然不会通过路由方式进行Binding和 GetController的lazyPut注入, 势必我们就需要一个入口来进行Binding
入口:
在这里插入图片描述
添加所需要的各种 Binding即可
在这里插入图片描述

  1. Get.offNamed()等路由函数 , 会导致上一个路由被移除

场景:
Main 路由跳转 Login路由, 使用了Get.offNamed(),进行路由跳转,会卸载上一个路由(即Main ),也会导致上一个路由注入的GetController被卸载!!!)
这就是属于上头正文里面说的第三种情况
在这里插入图片描述
猜测: 如 A->(toNamed)->B->(offNamed)->C, 应该会卸载B路由及B路由注入的各种控制器!!!

对于上述第四点问题的处理, 个人总结如下:

思路: 路由栈不移除任何路由,从而不移除任何注入!!
跳转:
禁止使用 Get.offNamed("/xxxPage"); or Get.offAllNamed("/home");
改为必须使用 Get.toNamed('/xxxPage')
(那Main->Login这种类似栈切换的跳转怎么体现? -> 在路由列表里面配置从底部弹起的动画效果即可!!!)
返回:
如果是简单返回, 使用Get.back()
如果是多级返回, 使用 Get.until((route) => Get.currentRoute == Routes.MAIN);
(如: 从Login - > Main: Get.until((route) => Get.currentRoute == Routes.MAIN))
(如果直接在 Login 使用Get.back(), 会在导航头被添加一个返回按钮,效果不好,pass!!)

B: GetController的冷知识

1.Get.put(XxxController());只需注入一次即可

2.GetController的生命周期(onInit)等回调

如果是 Get.put(XxxxController()). 那么 onInit等生命周期回调立即执行,
如果是 Get.lazyPut<XxxxController>(() => XxxxController()); , 那么 onInit
等生命周期回调会在最先触发的 Get.find<XxxxController>()后执行

C: 总结来看

1.Get的路由, 尽量不要用 offNamded(用了就要自己维护各种控制器的注入, 得去手动写 Get.put(xxx)), 改用 toNamed就好
2.路由返回指定路由 用 until
3.本项目中: 提供一个初始的Bingding - InitialBindings ,用于挂在无法通过路由方式触发的GetController

D: 一些参考资料

Flutter Getx实战
GetX使用笔记+心得
Flutter学习(七)GetX offAllNamed使用的问题

//路由跳转对应含义
Get.to(Home());//通过定义的widget名称来跳转到指定页面
Get.off(Home());//跳转到下个页面,没有返回按钮
Get.offAll(Home());//跳转到下个页面,移除所有的路由
Get.toNamed("/home");//通过路由名称来跳转到指定页面
Get.offNamed("/home");//跳转到下个页面,没有返回按钮
Get.offAllNamed("/home"),//跳转到下个页面,移除所有的路由//反复返回,直到表达式返回真。
Get.until() // 项目里写法: Get.until((route) => Get.currentRoute == Routes.MAIN);
// 转到下一条路由,并删除所有之前的路由,直到表达式返回true。
Get.offUntil()
// 转到下一个命名的路由,并删除所有之前的路由,直到表达式返回true。
Get.offNamedUntil()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/10842.shtml

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

相关文章

智慧旅游平台开发微信小程序【附源码、文档说明】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

关于DDD和COLA的一些总结和思考

1|0思维&#xff1a;面向对象和面向过程 领域驱动设计本质上是讲的面向对象&#xff0c;但是谈面向对象&#xff0c;始终无法绕开面向过程&#xff0c;所以我们先好好说一下面向过程和面向对象这两个概念。 什么是面向过程呢&#xff0c;其实就是我们学习编程时最初被植入的逻辑…

【安全每日一讲】加强数据安全保护 共享数字化时代便利

前言 数据安全是数据治理的核心内容之一&#xff0c;随着数据治理的深入&#xff0c;我不断的碰到数据安全中的金发姑娘问题&#xff08;指安全和效率的平衡&#xff09;。 DAMA说&#xff0c;降低风险和促进业务增长是数据安全活动的主要驱动因素&#xff0c;数据安全是一种资…

sbt安装

一、sbt介绍 在Spark中&#xff0c;sbt&#xff08;Scala Build Tool&#xff09;是一个用于构建Scala项目的工具。它是Spark项目的主要构建工具之一&#xff0c;用于编译Scala代码、管理依赖项、打包应用程序以及执行其他与项目构建相关的任务。 sbt的用途在Spark开发中主要…

基于Nios软件实现流水灯+串口输出

基于NIOS-II软核实现流水灯串口输出 引言&#xff1a; ​ 在现代电子设计领域&#xff0c;FPGA&#xff08;现场可编程门阵列&#xff09;因其灵活性和并行处理能力而成为实现复杂数字系统的首选平台。Nios II&#xff0c;作为Altera&#xff08;现为Intel旗下&#xff09;提供…

VMware虚拟机故障:“显示指定的文件不是虚拟磁盘“,处理办法

一、故障现象 由于虚拟机宕机&#xff0c;强制重新启动虚拟机后显示错误&#xff0c;没有办法启动虚拟机。 虚拟机有快照&#xff0c;执行快照还原&#xff0c;结果也不行&#xff0c;反复操作&#xff0c;在虚拟机文件目录出现很多莫名文件 二、故障原因 根据故障提示&#…

数据结构(C):玩转链表

目录 &#x1f37a;0.前言 1.链表的概念 2.链表的分类 2.1带头不带头 2.2单向和双向 2.3循环和不循环 2.4主要使用的链表 3.链表的实现 3.1申请一个链表 3.2头插和尾插 3.2.1函数的形参问题 3.2.2二级指针问题解决 3.3头删和尾删 3.4打印链表 3.5查找 3.5销…

【谷粒商城】03创建商品模块

1.创建模块 2.创建项目微服务 商品服务、仓储服务、订单服务、优惠券服务、用户服务 共同&#xff1a; 1&#xff09;、web、openfeign 2&#xff09;、每一个服务&#xff0c;包名 com.atguigu.gulimall.xxx(product/order/ware/coupon/member) 3&#xff09;、模块名&#x…

​《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制德国每日风能和太阳能产量3D线图

在MATLAB中&#xff0c;要绘制3D线图&#xff0c;可以使用 plot3 函数。 在《MATLAB科研绘图与学术图表绘制从入门到精通》书中通过绘制德国每日风能和太阳能产量3D线图解释了如何在MATLAB中绘制3D线图。 购书地址&#xff1a;https://item.jd.com/14102657.html

完美解决Windows10下-更换JDK环境变量后,在cmd下执行仍java -version然出现原来版本的JDK的问题

一、错误场景预演 本人欲将 JDK 1.8 通过安装包的方式升级为 JDK 22。 本地旧版本&#xff1a;1.8.0_221预升级版本&#xff1a;22.0.1 1.1、查看本地旧版本 在配置环境变量之前&#xff0c;首先我们要明确&#xff0c;本地存在旧版本&#xff0c;如果本地没有 Java&#x…

MFC通过继承现有控件自定义控件

在MFC 自定义控件&#xff0c;可以通过继承MFC提供的控件类&#xff08;如CButton、CEdit、CListBox等&#xff09;并重写其成员函数和消息处理函数来实现。 以下是一个基本的步骤指南&#xff0c;用于在MFC中创建自定义控件&#xff1a; 确定要继承的基类&#xff1a; 首先…

vm16安装最新版本的ubuntu虚拟机,并安装g++的步骤记录

背景 低版本的ubuntu安装G一直不成功&#xff0c;干脆安装最新版的 官网下载 bing搜索ubuntu 下载完成 vm16新建虚拟机 一直下一步&#xff0c;安装完成 终端输入命令 sudo apt-get update ᅟᅠ       sudo apt install gcc ᅟᅠ      sudo apt install g

树莓派点亮FPGA小灯

树莓派点亮FPGA小灯 引言&#xff1a; ​ 本次实验的目的是通过树莓派和FPGA之间的串口通信&#xff0c;控制FPGA开发板上的小灯。实验将展示如何使用树莓派发送特定的字符信号&#xff0c;通过串口传输至FPGA&#xff0c;并在FPGA上实现逻辑解析&#xff0c;以点亮指定的小灯。…

【QT】QT背景介绍

本专栏内容为&#xff1a;QT学习专栏 通过本专栏的深入学习&#xff0c;你可以了解并掌握QT。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;QT &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f…

3D分子生成的定制扩散框架 MolDiff - 评测

MolDiff模型是一种考虑分子键生成的3D分子生成的新模型。MolDiff是清华大学智能产业研究院马剑竹课题组发表在PMLR 2023的工作&#xff0c;第一作者是Xingang Peng&#xff0c;文章题目为&#xff1a;《 Addressing the Atom-Bond Inconsistency Problem in 3D Molecule Genera…

【Android】Kotlin学习之数据容器 -- 集合

一. 定义 List : 是一个有序列表, 可通过下标访问元素. 元素可以在list中出现多次, 元素可重复 Set : 是元素唯一的集合, 一般来说Set中元素的顺序并不重要, 无序集合. Map : 是一组键值对, 键是唯一的, 每个键刚好映射到一个值, 值可以重复 二. 集合创建 三. 示例 mutabl…

OSTE-Web-Log-Analyzer:基于Python的Web服务器日志自动化分析工具

关于OSTE-Web-Log-Analyzer OSTE-Web-Log-Analyzer是一款功能强大的Web服务器日志自动化分析工具&#xff0c;该工具专为安全研究人员设计&#xff0c;能够使用Python Web日志分析工具&#xff08;Python Web Log Analyzer&#xff09;帮助广大研究人员以自动化的形式实现Web服…

推导 模型矩阵的逆转置矩阵求运动物体的法向量

一个物体表面的法向量如何随着物体的坐标变换而改变&#xff0c;取决于变换的类型。使用逆转置矩阵&#xff0c;可以安全地解决该问题&#xff0c;而无须陷入过度复杂的计算中。 法向量变化规律 平移变换不会改变法向量&#xff0c;因为平移不会改变物体的方向。 旋转变换会改…

栈和队列的相互实现

1. 两个队列实现栈. - 力扣&#xff08;LeetCode&#xff09; 队列的特点是先进先出&#xff0c;而栈的特点是后进先出&#xff08;先进后出&#xff09;&#xff0c;也就是说重点在于利用两个队列来改变“出”的顺序。 假设我们在进行入栈操作的时候将数据依次入到一个队列中…

python如何单步调试

Python怎么单步调试&#xff1f;下面给大家介绍一下单步调试&#xff1a; 方法一&#xff1a;执行 python -m pdb myscript.py (Pdb) 会自己主动停在第一行。等待调试&#xff0c;这时你能够看看帮助。 方法二&#xff1a;在所调试程序的开头中&#xff1a;import pdb 并在你…