Flutter GetX系列教程---GetxController

news2024/11/25 2:35:14

安装

将 GetX 添加到你的 pubspec.yaml 文件中

dependencies:
   get: ^4.6.5

在需要用到的文件中导入,它将被使用。

import 'package:get/get.dart';

GetxController介绍

在实际的项目开发过程中,我们不可能把UI代码、业务逻辑都放在一起处理,这样对项目的架构、代码的可读性、后期的维护将会是致命的,好在GetX为我们提供了GetxController,GetxController主要的作用是用于UI代码与业务逻辑分离开来。

GetxController三种使用方式

// 第一种
 Obx(()=>Text(
   "测试数据是:${myController.trancher.name}"
   )),
 // 第二种
 GetX<MyController>(
   init: MyController(),
   builder: ((controller) {
     return Text(
       "测试数据2:${controller.trancher.name}"
     );
   }),
 ),
 // 第三种
 GetBuilder<MyController>(
     init: myController,
     builder: ((controller) {
       return Text("测试数据GetBuilder:${controller.trancher.name}");
     })
 ),

代码

在这里插入图片描述

main.dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'GetXControllerExample/GetXControllerExample.dart';
void main(){
  return runApp(Home());
}

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: "",
      home: GetXControllerExample(),
    );
  }
}

GetXControllerExample.dart

import 'package:flutter/material.dart';
import 'package:untitled/GetXControllerExample/MyController.dart';
import 'package:get/get.dart';

class GetXControllerExample extends StatelessWidget {

  MyController myController = Get.put(MyController());

  
  Widget build(BuildContext context) {
    return Container(
      child: Scaffold(
        appBar: AppBar(
          title: Text("GetXController"),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              // 第一种
              // Obx(()=>Text(
              //   "测试数据是:${myController.trancher.name}"
              //   )),
              // 第二种
              GetX<MyController>(
                init: MyController(),
                builder: ((controller) {
                  return Text(
                    "测试数据2:${controller.trancher.name}"
                  );
                }),
              ),
              // 第三种
              // GetBuilder<MyController>(
              //     init: myController,
              //     builder: ((controller) {
              //       return Text("测试数据GetBuilder:${controller.trancher.name}");
              //     })
              // ),
              SizedBox(height: 20,),
              ElevatedButton(onPressed: (){
                // 第一种
                myController.convertToUpperCase();
                // 第二种
                // Get.find<MyController>().convertToUpperCase();
              }, child: Text("转换"))
            ],
          ),
        ),
      ),
    );
  }
}

MyController.dart

import 'package:get/get.dart';
class MyController extends GetxController{
  // 第一种
  // var trancher = Teacher();
  // void convertToUpperCase(){
  //   trancher.name.value = trancher.name.value.toUpperCase();
  // }

  // 第二种
  // var trancher =  trancher(name: "Jimi", age: 18).obs;
  // void convertToUpperCase() {
  //   teacher.update((val) {
  //     trancher.value.name = trancher.value.name.toString().toUpperCase();
  //   });
  // }

  // 第三种
  var trancher = Teacher();

  void convertToUpperCase() {
    trancher.name.value = "12323";
    update();
    print("执行了");
  }
}


class Teacher{
  var name = "ancde".obs;
  var age = 19.obs;
}

GetxController事件监听

GetxController的事件监听,包括监听单个值、多个值等。在这里插入图片描述

main.dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:untitled/GetXControllerCycle/GetXControllerCycle.dart';
void main(){
  return runApp(Home());
}
class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: "",
      home: GetXControllerCycle(),
    );
  }
}

GetXControllerCycle.dart

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

class GetXControllerCycle extends StatelessWidget {

  GetxControllerOn getxControllerOn = Get.put(GetxControllerOn());

  GetXControllerCycle({super.key});

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("GetxController事件监听"),
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.center,
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(onPressed: ()=>{
            getxControllerOn.increment()
          }, child: Text("加1"))
        ],
      ),
    );
  }
}

GetxControllerOn.dart

import 'package:get/get.dart';
class GetxControllerOn extends GetxController {
  var count = 0.obs;
  void increment() {
    print("执行了");
    count++;
  }
  //重写onInit并监听事件
  
  void onInit() {
    // 监听count的值,当它发生改变的时候调用
    ever(count, (callback)=>print("ever---$count"));
    // 监听多个值,当它们发生改变的时候调用
    everAll([count], (callback) => print("everAll----$count"));
    // count值改变时调用,只执行一次
    once(count, (callback) => print("once----$count"));
    // 用户停止打字时1秒后调用,主要是防DDos
    debounce(count, (callback) => print("debounce----$count"));
    // 忽略3秒内的所有变动
    interval(count, (callback) => print("interval----$count"));
    super.onInit();
  }
}

GetxController生命周期

GetxController的生命周期,包括初始化、加载完成、销毁等。

GetxControllerOn.dart

import 'package:get/get.dart';
class GetxControllerOn extends GetxController {
  var count = 0.obs;
  void increment() {
    print("执行了");
    count++;
  }
  //重写onInit并监听事件
  
  void onInit() {
    print("初始化");
    // 监听count的值,当它发生改变的时候调用
    ever(count, (callback)=>print("ever---$count"));
    // 监听多个值,当它们发生改变的时候调用
    everAll([count], (callback) => print("everAll----$count"));
    // count值改变时调用,只执行一次
    once(count, (callback) => print("once----$count"));
    // 用户停止打字时1秒后调用,主要是防DDos
    debounce(count, (callback) => print("debounce----$count"));
    // 忽略3秒内的所有变动
    interval(count, (callback) => print("interval----$count"));
    super.onInit();
  }

  
  void onReady() {
    // TODO: implement onReady
    print("加载完成");
    super.onReady();
  }

  
  void onClose() {
    // TODO: implement onClose
    print("控制器被释放");
    super.onClose();
  }
}

GetxController UniqueID

我们在开发的过程中会碰到一种情况,就是多个地方引用了同一个属性,但我只想单独更新某一个地方,那么就可以用UniqueID来进行区分。

main.dart


GetXControllerUniqueID.dart

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

class GetXControllerUniqueID extends StatelessWidget {

  CountController countController = Get.put(CountController());

  
  Widget build(BuildContext context) {
    return Container(
      child: Scaffold(
        appBar: AppBar(
          title: Text("GetxController UniqueID"),
        ),
        body: Center(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              GetBuilder<CountController>(builder: (context){
                return Text(
                  "计数器值为: ${countController.count}",
                );
              }),
              GetBuilder<CountController>(
                  id:"yuyu_count",
                  builder: (context){
                return Text(
                  "计数器值为: ${countController.count}",
                );
              }),
              SizedBox(height: 30,),
              ElevatedButton(onPressed: ()=>{
                countController.increment()
              }, child: Text("增加"))
            ],
          ),
        ),
      ),
    );
  }
}


class CountController extends GetxController{
  var count = 0;

  void increment() {
    count++;
    update(['yuyu_count']);
  }
}

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

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

相关文章

Google 二次签名 导致 Facebook , Google 登录失败

前言&#xff1a; 最近接了几款游戏 里面携带了facebook 授权登录和google 授权问题 问题场景 在没有上线之前 我们运营和测试 验收都没有问题 但是把游戏包发到商店后再重商店下载出来就不能授权登录。 原因 因为App上传到Google Play后&#xff0c;Google Play 有个签名…

使用idea无法推送到gitee,显示head detached(游离分支)

在idea下将代码回退到某一历史版本&#xff0c;修改后push提醒detaced head&#xff0c;即处于游离状态&#xff0c;使用 git branch命令&#xff08;辅助git status查看提交状态&#xff09;查看&#xff1a; 解决方法 在git bash下***&#xff08;注意&#xff09;切换到项…

django使用一——规范化创建

背景 为便于后续维护&#xff0c;前期对django创建等操作做一些规范化要求 实操 1、【项目创建】先创建一个项目&#xff0c;其中SSS可以项目架构相关&#xff0c;XXX则是项目名称 常用命令&#xff1a; django startproject SSS_app_XXX如果提示报错django命令不存在&…

超全地牢场景unity3d模型素材网站整理

家人们&#xff0c;最近我找到了一个很好用的地牢场景unity3d模型免费素材网站 资源贼多&#xff0c;重点是免费&#xff01;&#xff01;&#xff01;嘿嘿嘿&#xff01;&#xff01;&#xff01;感兴趣的可以进去看看 接下来就给大家介绍一下我珍藏已久的网站&#xff1a; …

string类的基本使用及模拟实现(深浅拷贝)

目录 浅拷贝与深拷贝 string的基本使用和模拟实现 浅拷贝与深拷贝 namespace lyl { class string { public: string(const char* str) :_str(new char[strlen(str)1]) { strcpy(_str, str); } ~string() …

TPM零知识学习九 —— TPM规范学习之TPM介绍

前边的系列文章主要从实际平台移植和TPM环境搭建的角度讲解了TPM&#xff0c;现在到了踏实下来学习理论知识的时候了。从本篇文章开始&#xff0c;开启TPM2.0规范学习之旅。参考书目为&#xff1a;《A Practical Guide to TPM 2.0 — Using the Trusted Plaform Module in the …

利器 | REST Assured 实践(二):断言实现

在上一篇文章中&#xff0c;我们初步探讨了 REST Assured 的应用实践&#xff0c;还有很多丰富的用法需要慢慢探索研究。而 REST Assured 提供的完整断言手段&#xff0c;是测试工程师最常用最重要的功能之一。断言该如何使用呢&#xff1f; 这里以 rest-assured 官方给的一个…

好用的元数据管理工具是什么样

元数据是数据的“说明书”&#xff0c;元数据管理工具是企业数据治理的重要抓手&#xff0c;它可以帮助企业解决数据查找难、理解难等问题&#xff0c;促进数据的集成和共享。一个趁手的元数据管理工具是什么样的呢&#xff1f; 01 系统架构 从应用角度看&#xff0c;元数据管…

基于颜色直方图优化的图像增强方法

最近改图像颜色迁移的论文&#xff0c;审稿人要求补充基于直方图优化的方法细节。趁此机会&#xff0c;我重新下载了相关文献&#xff0c;决定重新学习下该类方法&#xff0c;并把一些细节记录在本篇博客中&#xff0c;供交流学习。 目录 1. 前言 2. 背景知识 3. 颜色变换 4. 颜…

若依源码分析(二)-登录流程源码分析

若依源码分析&#xff08;二&#xff09;-登录流程源码分析 本章节主要分析若依源码登录流程&#xff0c;一步一步走断点查看进入首页的全流程登录信息 1. 前台发起登录请求 http://127.0.0.1/dev-api/auth/login //auth表明这个请求走的是服务名称为auth的服务2. 后台处理流…

【虚幻引擎】UE4像素流推送PixelStreaming

一、前言 虚幻引擎像素流送&#xff08;Pixel Streaming&#xff09;允许你从任何有屏幕的联网设备&#xff08;例如计算机&#xff0c;手机&#xff0c;平板电脑等&#xff09;播放虚幻项目。在这个教程里&#xff0c;我们将学习如何激活虚幻引擎的像素流送并从任何Web浏览器控…

年尾结款,如何应对客户新的需求风险?

1、进行需求变更管理流程 需要提前建立需求基线&#xff0c;需求基线是需求变更的依据&#xff0c;并制定双方皆认可的需求变更流程。 在前期与用户签订合同时&#xff0c;可以增加一些相关条款&#xff0c;如限定用户提出需求变更的时间&#xff0c;规定何种情况的变更可以接受…

日期和时间的API

一、JDK8之前的日期和时间的API 1.System类中的currentTimeMillis() 返回当前时间与1970年1月1日0分0秒之间以毫秒为单位的时间差&#xff0c;称为时间戳 2.Java.util.Date类 |---java.sql.Date类 1.两个构造器的使用 >构造器一: Date(): 创建一个对应当前时间的Date对象…

CVE-2022-08475-DirtyPipe

前言CVE-2022-0847 DirtyPipe脏管道漏洞是Linux内核中的一个漏洞&#xff0c;该漏洞允许写只读文件&#xff0c;从而导致提权。调试环境• ubuntu 20.04• Linux-5.16.10• qemu-system-x86_64 4.2.1漏洞验证首先创建一个只读文件foo.txt&#xff0c;并且正常情况下是无法修改该…

2022年「博客之星」参赛博主:黛琳ghz

我正在参加年度博客之星评选&#xff0c;请大家帮我投票打分&#xff0c;您的每一分都是对我的支持与鼓励。五星必回&#xff0c;诚信互评&#xff0c;&#xff08;如果&#xff09;今日已满&#xff0c;明天必回&#xff0c;言出必行&#xff0c;感谢支持&#xff01; 我正在…

Protobuf:python版使用

目录 Protobuf详解 Python使用方式 下载protoc 编写.proto协议文件 编译Protocol buffer 存储/读取数据测试 Protobuf详解 深入 ProtoBuf - 简介 - 简书 (jianshu.com)[索引]文章索引 - 简书 (jianshu.com) Protobuf3语法详解 - 望星辰大海 - 博客园 (cnblogs.com) Pyth…

联芸科技冲刺科创板上市:业绩表现不稳定,实控人方小玲为美国籍

12月28日&#xff0c;联芸科技&#xff08;杭州&#xff09;股份有限公司&#xff08;下称“联芸科技”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。 本次冲刺上市&#xff0c;联芸科技计划募资20.50亿元&#xff0c;其中4.66亿元用于新一代数据存储…

prophet模块学习总结-20221228

prophet模块的基本介绍及相关用法说明。 文章目录1.基本介绍Prophet包的特点2.Prophet 模型介绍2.1 长期趋势模型2.2 The Seasonality Function&#xff08;季节函数&#xff09;2.3 The Holiday/Event Function&#xff08;节日函数&#xff09;3.使用示例3.1 快速开始3.2 调节…

MetersPhere自动化解决用户登录问题+添加钉钉机器人

MetersPhere自动化解决用户登录问题添加钉钉机器人 现在遇到的问题&#xff0c;做自动化的时候几乎每个接口都需要token&#xff0c;这个token是登录获取的&#xff0c;那我有很多个自动化的场景&#xff0c;如果我每一个场景都加入登录接口&#xff0c;同时执行很多场景的时候…

骨传导耳机有用吗,最好用的骨传导耳机分享

骨传导耳机有没有用这个问题&#xff0c;主要还是看自己需要骨传导耳机的根本需求是什么&#xff0c;骨传导耳机更多的使用场景是在户外运动&#xff0c;但是日常才室内使用或者长时间使用的耳机爱好者&#xff0c;骨传导耳机也能在一定程度上保护听力&#xff0c;下面就分享五…