GetX使用笔记+心得(持续更新...)

news2024/11/24 7:31:31
本文旨在记录在学习和使用GetX过程中遇到的问题和心得体会,如果有表达不正确的地方,欢迎下方留言指正😄😄

简书地址

#使用:
首先需要引入包,不赘述了,
其次在入口main.dart里面把MaterialApp换成GetMaterialApp

              return GetMaterialApp(
                debugShowCheckedModeBanner: false,
                translations: Messages(),
                //你的翻译
                locale: const Locale('zh', 'CN'),
                //按照此处指定的语言翻译
                fallbackLocale: const Locale('zh', 'CN'),
                //翻译不存在的时候使用次语言
                title: 'XXX',
                theme: appTheme,
                builder: EasyLoading.init(),
                initialRoute: routerPage,
                defaultTransition: Transition.rightToLeft,
                //默认跳转动画
                getPages: RouterPage.routes,
              );

然后就能在项目中使用了。
###首先是一些简单的使用:
#####弹框

//顶部弹框(toast)
Get.snackbar("Snackbar 标题", "欢迎使用Snackbar");

//弹框
Get.defaultDialog();
//底部弹框
Get. BottomSheet();

#####路由管理

//路由跳转
Get.to(Home());//通过定义的widget名称来跳转到指定页面
Get.off();//跳转到下个页面,没有返回按钮
Get.offAll();//跳转到下个页面,移除所有的路由
Get.toNamed("/home");//通过路由名称来跳转到指定页面
Get.offNamed("/home");//跳转到下个页面,没有返回按钮
Get.offAllNamed("/home"),//跳转到下个页面,移除所有的路由

//路由跳转传值
Get.toNamed('/home',arguments: {'id':'sdssfsfsf121214'}),
//在下个页面接收传过来的值
Get.arguments['id']

//路由返回到上个页面,并作处理(比如添加数据之后,返回刷新页面)
i:路由跳转的时候,接收返回来的参数value,根据value做判断
Get.toNamed('home')!.then((value) {
      if (value) {
       //刷新页面
     }
});
ii:在路由返回的时候,传参
Get.back(result: true);

Get.toGet.toName的区别:
当使用的binding的时候,如果使用Get.to会报错
The following message was thrown building Builder: "xxxController" not found. You need to call "Get.put(xxxController())" or "Get.lazyPut(()=>xxxController())"

#####判断是否是手机号、邮箱。。

GetUtils.isEmail('xxx')
GetUtils.isPhoneNumber('xxx')
GetUtils.isDateTime('xxx')
GetUtils.isMD5('xxx')
...

#####其余API

//给出以前的路由名称
Get.previousRoute

// 给出要访问的原始路由,例如,rawRoute.isFirst()
Get.rawRoute

// 允许从GetObserver访问Rounting API。
Get.routing

// 检查 snackbar 是否打开
Get.isSnackbarOpen

// 检查 dialog 是否打开
Get.isDialogOpen

// 检查 bottomsheet 是否打开
Get.isBottomSheetOpen

// 删除一个路由。
Get.removeRoute()

//反复返回,直到表达式返回真。
Get.until()

// 转到下一条路由,并删除所有之前的路由,直到表达式返回true。
Get.offUntil()

// 转到下一个命名的路由,并删除所有之前的路由,直到表达式返回true。
Get.offNamedUntil()

//检查应用程序在哪个平台上运行。
GetPlatform.isAndroid
GetPlatform.isIOS
GetPlatform.isMacOS
GetPlatform.isWindows
GetPlatform.isLinux
GetPlatform.isFuchsia

//检查设备类型
GetPlatform.isMobile
GetPlatform.isDesktop
//所有平台都是独立支持web的!
//你可以知道你是否在浏览器内运行。
//在Windows、iOS、OSX、Android等系统上。
GetPlatform.isWeb


// 相当于.MediaQuery.of(context).size.height,
//但不可改变。
Get.height
Get.width

// 提供当前上下文。
Get.context

// 在你的代码中的任何地方,在前台提供 snackbar/dialog/bottomsheet 的上下文。
Get.contextOverlay

// 注意:以下方法是对上下文的扩展。
// 因为在你的UI的任何地方都可以访问上下文,你可以在UI代码的任何地方使用它。

// 如果你需要一个可改变的高度/宽度(如桌面或浏览器窗口可以缩放),你将需要使用上下文。
context.width
context.height

// 让您可以定义一半的页面、三分之一的页面等。
// 对响应式应用很有用。
// 参数: dividedBy (double) 可选 - 默认值:1
// 参数: reducedBy (double) 可选 - 默认值:0。
context.heightTransformer()
context.widthTransformer()

/// 类似于 MediaQuery.of(context).size。
context.mediaQuerySize()

/// 类似于 MediaQuery.of(context).padding。
context.mediaQueryPadding()

/// 类似于 MediaQuery.of(context).viewPadding。
context.mediaQueryViewPadding()

/// 类似于 MediaQuery.of(context).viewInsets。
context.mediaQueryViewInsets()

/// 类似于 MediaQuery.of(context).orientation;
context.orientation()

///检查设备是否处于横向模式
context.isLandscape()

///检查设备是否处于纵向模式。
context.isPortrait()

///类似于MediaQuery.of(context).devicePixelRatio。
context.devicePixelRatio()

///类似于MediaQuery.of(context).textScaleFactor。
context.textScaleFactor()

///查询设备最短边。
context.mediaQueryShortestSide()

///如果宽度大于800,则为真。
context.showNavbar()

///如果最短边小于600p,则为真。
context.isPhone()

///如果最短边大于600p,则为真。
context.isSmallTablet()

///如果最短边大于720p,则为真。
context.isLargeTablet()

///如果当前设备是平板电脑,则为真
context.isTablet()

///根据页面大小返回一个值<T>。
///可以给值为:
///watch:如果最短边小于300
///mobile:如果最短边小于600
///tablet:如果最短边(shortestSide)小于1200
///desktop:如果宽度大于1200
context.responsiveValue<T>()

###其次–状态管理:
Getx有两种状态管理:简单状态管理GetBuilder、响应式状态管理器GetX/Obx
1、在定义变量的时候,加上.obs

var name = 'Jonatas Borges'.obs;

2、在 UI 中,当您想要显示该值并在值更改时更新屏幕时,用Obx包裹控件,如下:

Obx(() => Text("$name"));

3、赋值的时候

name.value = 'Jack';

上面这种我们可以称之为局部刷新,就是当name的值改变了,只会刷新Text组件,不会刷新整个页面的UI,
使用GetBuilder是刷新整个页面,适合在列表页面使用

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('maintain_record'.tr)),
      body: GetBuilder(
        builder: (_) {
          return const Padding(
            padding: EdgeInsets.all(10.0),
            child: Column(
              children: [
              ],
            ),
          );
        }
      ),
    );
  }

依赖注入-Controller的使用,我感觉能叫他全局状态管理

比如我有两个页面,两个页面都有个Text的组件显示count的值,在两个页面分别修改了count的值,两个页面都会跟着改变,效果如下
gif.gif

可以看到,在两个页面分别操作count的值,两边显示都是一样的
实现:
class_room_page.dart中定义一个Text和button

import 'package:flutter/material.dart';
import 'package:get/get.dart';

class ClassRoomPage extends StatelessWidget {
  const ClassRoomPage({super.key});

  @override
  Widget build(BuildContext context) {
    final controller = Get.put<ClassRoomController>(ClassRoomController());
    return Container(
      alignment: const Alignment(0, 0),
      child: SizedBox(
        width: Get.width,
        height: 300,
        child: Column(
          children: [
            Obx(() => Text('count的值:${controller.count}')),
            TextButton(
              onPressed: () {
                controller.increment();
              },
              child: const Text('count +1'),
            ),
          ],
        ),
      ),
    );
  }
}

同意在store_page.dart

import 'package:firstapp/pages/class_room/class_room_controller.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

class StorePage extends StatelessWidget {
  const StorePage({super.key});

  @override
  Widget build(BuildContext context) {
    final controller = Get.find<ClassRoomController>();
    return Container(
      alignment: const Alignment(0, 0),
      child: SizedBox(
        width: Get.width,
        height: 300,
        child: Column(
          children: [
            Obx(() => Text('count的值:${controller.count}')),
            TextButton(
              onPressed: () {
                controller.decrement();
              },
              child: const Text('count -1'),
            ),
          ],
        ),
      ),
    );
  }
}

然后定一个一个Controller—class_room_controller.dart

import 'package:get/get.dart';

class ClassRoomController extends GetxController {
  var count = 0.obs;

  void increment() {
    count++;
  }

  void decrement() {
    count--;
  }
}

里面有两个方法和一个变量,Controller必须要put一次,然后在别的地方使用的时候用find,我们一般是使用binding来管理Controller,所以修改一下项目结构,新增一个binding,
all_controller_binding.dart

import 'package:firstapp/pages/class_room/class_room_controller.dart';
import 'package:get/get.dart';

class AllBinding extends Bindings {
  @override
  void dependencies() {
    Get.lazyPut<ClassRoomController>(() => ClassRoomController());
  }
}

然后再路由中注入binding

GetPage(
      name: '/tab',
      page: () => const TabBarPage(),
      binding: AllBinding(),
    ),

然后把class_room_page.dartfinal controller = Get.put<ClassRoomController>(ClassRoomController());换成final controller = Get.find<ClassRoomController>();
但是要注意,在哪个页面使用binding的时候,在路由跳转到这个页面的时候,一定要用Get.toName,

###国际化
image.png

其中message.dart里面都是对照的翻译

class Messages extends Translations {
  @override
  Map<String, Map<String, String>> get keys => {
        'zh_CN': {
          //登录
          'email': '邮箱',
          'hint_email': '请输入邮箱',
          'hint_email_text': '请输入正确的邮箱',
        },
        'en_US': {
          // Login
          'email': 'Email',
          'hint_email': 'Please enter your email',
          'hint_email_text': 'Please enter the correct email address',
        }
      };
}

使用的时候,用Text(‘email’.tr);

用Get实现MVC布局

所有的页面布局都在view中实现,数据处理在Controller里面实现,view继承的是GetView,在布局中不再使用StatefulWidget
如下图:
image.png
view里面的代码

class MyView extends GetView<MyController> {
  const MyView({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('MVC'),
      ),
      body: GetBuilder<MyController>(
        builder: (_) {
          return ListView.builder(
            itemCount: controller.dataList.length,
            itemExtent: 50,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('${controller.dataList[index].name}'),
              );
            },
          );
        },
      ),
    );
  }
}

Controller里面的代码

class MyController extends GetxController {
  final List<ListModel> dataList = <ListModel>[].obs;
  @override
  void onReady() {
    _getData(); //获取数据
    super.onReady();
  }

  Future<void> _getData() async {
    String jsonData = await loadJsonData();
    Map<String, dynamic> data = json.decode(jsonData);
    dataList.clear();
    dataList.addAll(
        data['data'].map<ListModel>((e) => ListModel.fromJson(e)).toList());
    update();
  }
}

Future<String> loadJsonData() async {
  return await rootBundle.loadString('assets/json/list.json');
}

写了个简单的demo,可以down下来看看,Demo传送门
###后续继续更新…

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

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

相关文章

mybatis动态SQL-choose-when-otherwise

1、建库建表 create database mybatis-example; use mybatis-example; create table emp (empNo varchar(40),empName varchar(100),sal int,deptno varchar(10) ); insert into emp values(e001,张三,8000,d001); insert into emp values(e002,李四,9000,d001); insert into…

线性代数基础【2】矩阵

第二章 矩阵 第一节 矩阵的基本概念与特殊矩阵 一、基本概念 ①矩阵 像如下图示的为矩阵,记为A(aij)m*n ②同型矩阵及矩阵相等 若A、B为如下两个矩阵 如果A和B的行数和列数相等,那么A和B为同型矩阵,且A和B的元素相等(即:aijbij),则称A和B相等 ③伴随矩阵 设A为mn矩阵(如上…

论文润色突显研究亮点 papergpt

大家好&#xff0c;今天来聊聊论文润色突显研究亮点&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 标题&#xff1a;论文润色突显研究亮点――提升论文吸引力的关键步骤 一、引言 在学术研究中&#x…

常用的建表但范式、反规范化

规范化&#xff1a; 规范化是用于数据库设计的一系列原理和技术&#xff0c;它可以减少表中数据的冗余&#xff0c;增加数据完整性和一致性。通常有很多范式。 第一范式&#xff08;1NF&#xff09;&#xff1a; 常用的三种范式&#xff1a; 表中的字段都是不可再分割的原子属…

math.gamma()

伽马函数 将阶乘一般化&#xff0c;即将阶乘推广到实数域。 gamma(x) integral(0 to inf) of t^(x-1) * exp(-t) dt 不推了&#xff0c;总之就是表示阶乘

计网Lesson10 - 网络层之IP协议分析

文章目录 网络层协议IPv4 数据报格式IPv4 数据报首部格式版本&#xff08;Version&#xff09;首部长度&#xff08;Header Length&#xff09;区分服务&#xff08;Differentiated Services Field&#xff09;可选字段填充总长度&#xff08;Total Length&#xff09;标识、标…

JavaEE进阶学习: SpringBoot 日志文件

1.日志有什么用 日志的主要作用是记录系统的运行状态、事件和错误信息等。具体来说&#xff0c;日志可以用于以下几个方面&#xff1a; 故障排除&#xff1a;当系统出现故障或错误时&#xff0c;日志可以帮助开发人员定位问题的具体原因和位置&#xff0c;从而更快地修复系统。…

计算机网络简答题

面向连接和非连接的服务特点 面向连接的服务&#xff1a;通信双方在进行通信之前&#xff0c;要事先建立一个完整的可以彼此沟通的通道&#xff0c;在通信过程中整个连接的情况可以被实时的监控和管理 面向非链接的服务&#xff1a;不需要预先建立一个联络两个通信节点的连接&a…

【obs】官方最强插件obs-websocket入门

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ obs-websocket简介OBS版本说明obs-websocket版本说明安装&#xff08;27.x版本OBS&#xff09;配置插件 2️⃣ OBS-web介绍特征使用方法-5.xhttp vs https 3️⃣ obs-websocket-js开发tester.html 4️⃣ 其它开源项目obs-stud…

做题笔记:SQL Sever 方式做牛客SQL的题目--查询每天刷题通过数最多的前二名用户

----查询每天刷题通过数最多的前二名用户id和刷题数 现有牛客刷题表questions_pass_record&#xff0c;请查询每天刷题通过数最多的前二名用户id和刷题数&#xff0c;输出按照日期升序排序&#xff0c;查询返回结果名称和顺序为&#xff1a; date|user_id|pass_count 表单创建…

双指针的运用——双数之和II和三数之和

两数之和 https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/description/ 我们考虑这个排序过的数组&#xff0c;首先一个指针在最左&#xff0c;一个在最右。如果这两个数字比目标数字来的要小&#xff0c;那么如果我们左边指针移动了&#xff0c;移动后一定变…

高通平台开发系列讲解(USB篇)linux下如何让U盘可以识别问题

文章目录 一、简述二、修改方法三、宏介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 一、简述 对于一些U盘不能自动被Linux内核识别的情况,可能需要进行一些调整和修改内核驱动的设置。 二、修改方法 在kernel中开启以下的宏开关 CONFIG_USB_STORAGE=y CONFIG_SCSI=…

uniapp原生插件之安卓app添加到其他应用打开原生插件

插件介绍 安卓app添加到其他应用打开原生插件&#xff0c;接收分享的文本和文件&#xff0c;支持获取和清空剪切板内容 插件地址 安卓app添加到其他应用打开原生插件&#xff0c;支持获取剪切板内容 - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 详细使用文档 u…

第三届《我们的世界》---2023 国际当代艺术展在广州沙面隆重启幕

开幕快讯 2023年12月10日下午,由法国表现主义画院与东方荟萃艺术学院 联合主办的,由法中艺术交流协会、香港博物馆世界、让米歇尔艺术空 间共同协办,法国驻广州总领事馆支持的第三届《我们的世界》---2023 国际当代艺术展在广州沙面隆重启幕! 嘉宾签到现场 本次展览集合了30位活…

50.0/表格(详细版)

目录 50.1 建立表格 50.2 表格边框 50.3 设置表格或单元格的宽度和高度 50.4 表格的背景设置 50.5 表格边框颜色的设置 50.6 表格的位置 50.6.1 水平位置 50.6.2 垂直位置 50.7 为表格添加表头和标题 50.8 单元格的合并 50.8.1 跨行 50.8.2 跨列 50.9 综合示例 通…

Android---Kotlin 学习005

substring 字符串截取。相加与 java&#xff0c;kt 里面的 substring 函数支持 IntRange 类型&#xff08;表示一个整数范围的类型&#xff09;的参数&#xff0c;until 创建的范围不包括上限值。 const val NAME "Jimmys friend" fun main(){val index NAME.ind…

python 安装对应版本的lxml

安装对应版本的lxml 先把对应版本的lxml文件下载下来&#xff0c;接着在文件夹路径输入cmd回车&#xff0c;用下面命令安装。

《洛谷深入浅出进阶篇》 进阶数论

本文章内容比较长&#xff0c;请耐心食用&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 目录&#xff1a; 模意义下的数和运算喵~ 模意义下的乘法逆元喵~ 同余方程与中国剩余定理喵~ 线性筛与积性函数喵~ 欧拉函数喵~ 一&#xff0c;模意义下的数和运算。…

Android : Room 数据库的基本用法 —简单应用_一_入门

1.Room介绍&#xff1a; Android Room 是 Android 官方提供的一个持久性库&#xff0c;用于在 Android 应用程序中管理数据库。它提供了一个简单的 API 层&#xff0c;使得使用 SQLite 数据库变得更加容易和方便。 以下是 Android Room 的主要特点&#xff1a; 对象关系映射…

Ajax原理以及优缺点

Ajax原理 1.Ajax的原理简单来说是在用户和服务器之间加了—个中间层(AJAX引擎)&#xff0c;通过XmlHttpRequest对象来向服务器发异步请求&#xff0c; 2.从服务器获得数据&#xff0c;然后用javascript来操作DOM而更新页面。使用户操作与服务器响应异步化。 3.这其中最关键的一…