jjzjj

GETX

东方奇迹 2023-03-28 原文

GetX 是 Flutter 上的一个轻量且强大的解决方案:高性能的状态管理、智能的依赖注入和便捷的路由管理。

1、状态管理

  • Obx是配合Rx响应式变量使用、GetBuilder是配合update使用:请注意,这完全是俩套定点刷新控件的方案。
    区别:前者响应式变量变化,Obx自动刷新;后者需要使用update手动调用刷新

  • 每一个响应式变量,都需要生成对应的GetStream,占用资源大于基本数据类型,会对内存造成一定压力

  • GetBuilder内部实际上是对StatefulWidget的封装,所以占用资源极小(推荐使用)

2、控制器的注入

  • 静态路由绑定
class AsWorkStatisticsBinding implements Bindings {
  @override
  void dependencies() {
    Get.lazyPut<AsWorkStatisticsController>(() => AsWorkStatisticsController());
  }
}

static final List<GetPage> routes = [
    GetPage(
      name: workStatisticsPage,
      page: () => const AsWorkStatisticsPage(),
      binding: AsWorkStatisticsBinding(),
    ),
];
Get.toNamed(ASRouteConfig.workPlanDetailPage);
  • 动态路由绑定
Get.to(AsWorkStatisticsPage(),binding: AsWorkStatisticsBinding());

  • 页面注入
    Get.lazyPut<AsWorkStatisticsController>(() => AsWorkStatisticsController());

3、动态/简单路由和静态/命名路由

请注意命名路由,只需要在api结尾加上Named即可,举例:

  • 默认:Get.to(SomePage());
  • 命名路由:Get.toNamed(“/somePage”);
  • 导航到新的页面
Get.to(NextScreen());
Get.toNamed("/NextScreen");
  • 关闭SnackBars、Dialogs、BottomSheets或任何你通常会用Navigator.pop(context)关闭的东西
Get.back();
  • 进入下一个页面,但没有返回上一个页面的选项(用于SplashScreens,登录页面等)
Get.off(NextScreen());
Get.offNamed("/NextScreen");
  • 进入下一个界面并取消之前的所有路由(在购物车、投票和测试中很有用)
Get.offAll(NextScreen());
Get.offAllNamed("/NextScreen");
  • 发送数据到其它页面

只要发送你想要的参数即可。Get在这里接受任何东西,无论是一个字符串,一个Map,一个List,甚至一个类的实例。

Get.to(NextScreen(), arguments: 'Get is the best');
Get.toNamed("/NextScreen", arguments: 'Get is the best');

在你的类或控制器上。

print(Get.arguments);
//print out: Get is the best
  • 要导航到下一条路由,并在返回后立即接收或更新数据
var data = await Get.to(Payment());
var data = await Get.toNamed("/payment");
  • 在另一个页面上,发送前一个路由的数据
Get.back(result: 'success');
// 并使用它,例:
if(data == 'success') madeAnything();
  • 跳转重复页面,可以这样写
Get.to(XxxxPage(), preventDuplicates: false);
// 或者
Get.toNamed('xxx',  preventDuplicates: false);
  • 如果你不想使用GetX语法,只要把 Navigator(大写)改成 navigator(小写),你就可以拥有标准导航的所有功能,而不需要使用context,例如:
// 默认的Flutter导航
Navigator.of(context).push(
  context,
  MaterialPageRoute(
    builder: (BuildContext context) {
      return HomePage();
    },
  ),
);

// 使用Flutter语法获得,而不需要context。
navigator.push(
  MaterialPageRoute(
    builder: (_) {
      return HomePage();
    },
  ),
);

// get语法
Get.to(HomePage());

4、GetView的使用

GetView只是对已注册的Controller有一个名为controller的getter的const Stateless的Widget,如果我们只有单个控制器作为依赖项,那我们就可以使用GetView,而不是使用StatelessWidget,并且避免了写Get.Find()。

GetView的使用方法非常简单,只是要将你的视图层继承自GetView并传入需要注册的控制器并Get.put()即可:

class GetViewAndGetWidgetExample extends GetView<GetViewCountController> {
  @override
  Widget build(BuildContext context) {

    Get.put(GetViewCountController());

    return Container();
  }
}

有关GETX的更多相关文章

  1. java - 我应该使用 Point.x 还是 Point.getX()? - 2

    我有一个点。我正在尝试将x作为int。如果我使用Point.x,我将得到x作为int。但我的印象是我应该尽可能使用setter/getter(Whyusegettersandsetters?)。Point.getX()的问题是它返回一个double而不是一个整数。哪个更好,还是只是偏好?a还是b?Pointpoint=newPoint(5,5);inta=point.x;intb=(int)point.getX();我已阅读JavaPoint,differencebetweengetX()andpoint.x,但它并没有真正回答我的问题。或者至少我不明白答案。

  2. java - 矩形类函数 getX()、getY() 等以 double 返回 - 2

    嗯,根据我的经验和OracleJavaAPI文档,我知道他们这样做,但我想知道为什么。通过构造函数,我只允许将int类型的参数传递给Rectangle类,x、y等的内部数据表示是类型int和setSize()仅排除int类型的参数。但是,为什么所有方法,如getX()、getY()、getWidth()等,在没有精确?为什么不像预期的那样简单int?编辑:我知道它是从Rectangle2D类派生的,但是仍然没有理由不提供任何基于int的getX()和getY()函数,与Point和Point2D类不同,这些方法不是抽象的。此外,setLocation()也不是抽象的。

  3. java - 为什么MouseEvent的getX() getY() 好像和真实坐标有偏移? - 2

    我在JFrame中嵌入了一个JPanel。JPanel被添加到BorderLayout的CENTER。我正在使用以下代码对其进行绘制,但MouseEvent的getX()和getY()似乎偏移了实际坐标。为什么?相关代码是:-privateImagebackBuffer=createImage(getWidth(),getHeight());publicvoidmouseDragged(MouseEvente){//System.out.println("Canvas.mouseDragged()");Graphics2Dg2d=(Graphics2D)backBuffer.getGr

  4. java - 在 getter 链之后安全地调用 setter,例如 foo.getX().getY().setZ(...); - 2

    如何在getter链之后安全地调用setter,例如foo.getX().getY().setZ(...);?例如,假设我有一个嵌套的POJO,我希望能够设置一个嵌套对象的字段。Foofoo=...foo.getX().getY().setZ(...);我希望行为是这样的,如果X和Y不存在,那么它们会自动创建;否则它会重用现有对象。换句话说,我希望它的行为等同于Foofoo=...Xx=foo.getX();if(x==null){x=newX();foo.setX(x);}Yy=x.getY();if(y==null){y=newY();x.setY(y);}y.setZ(...);

  5. c++ - 使用 C++ 预处理器的大写字母 (x -> getX/setX) - 2

    我想定义一些属性,例如:#defineproperty(T,x)Tx;Tget##x();voidset##x(Tvalue);classfoo{public:property(int,count);property(float,size);}但我希望方法被称为getCount/setCount而不是getcount/setcount。 最佳答案 正如评论所说,你不能那样做。预处理器不会做这些事情。所以你要么按照@Shahbaz在第一条评论中所说的,要么做这样的事情,让你得到和设置get_count和set_count形式。#def

  6. android - 拖动时跳转 ImageView。 getX() 和 getY() 值在跳跃 - 2

    我已经创建了一个用于拖动View的onTouchListener。如果我使用getRawX()和getRawY(),图像可以顺利拖动。这样做的问题是,当您放下第二个指针然后抬起第一个指针时,图像会跳到第二个指针。这个onTouchListener试图通过跟踪pointerId来解决这个问题。这个onTouchListener的问题是在拖动ImageView时,ImageView非常疯狂地跳来跳去。getX()和getY()值跳来跳去。我觉得我做得对。我不想为此编写自定义View,因为我已经实现了一个scaleGestureDetector并编写了一个可以工作的自定义rotateGest

  7. android - Motionevent.getX 和 getY - 2

    我需要帮助来理解以下内容。假设我有一个854x480像素的显示器。为什么MotionEvent.getX和getY方法返回float?据我所知,显示器上的像素是离散整数,显示器上没有半个像素。 最佳答案 来自开发者页面:“返回给定指针索引的此事件的X坐标(使用getPointerId(int)查找此索引的指针标识符)。整数是像素;该值可能有小数部分用于输入设备像素精确。”http://developer.android.com/reference/android/view/MotionEvent.html#getX()因此对于某些设

  8. Android View 的getTop()、getLeft()、getX()、getY()、getWidth()、getHeight()方法 - 2

    我正在编写一个拖放应用程序,并且因为某些参数而感到非常困惑。请大家帮忙解答首先,我阅读了View类的文档并得到了以下解释。getX():此View的视觉x位置,以像素为单位。getY():此View的视觉y位置,以像素为单位。getWidth():返回View的宽度。getHeight():返回View的宽度。getTop():此View相对于其父View的顶部位置。getLeft():此View相对于其父View的左侧位置。现在我们完成了官方文档,让我们看看我们有什么。我有一张原始尺寸为500x500的图片,名为circle。这是我的应用程序的实际屏幕截图这是布局的xml现在我关心的

  9. 基于GetX 搭建通用flutter 项目《一》(持续更新中....) - 2

    基于GetX搭建通用flutter项目《二》(界面规范抽象类)基于GetX搭建通用flutter项目《三》(暗黑模式)基于GetX搭建通用flutter项目《四》(国际化)基于GetX搭建通用flutter项目《五》(基于GetX进行动态刷新)之前一直想把自己工作中总结的东西,写成文档,但也是懒,一直都没动笔.今天在做2022年中回顾的时候,看到之前写的flutter项目架构这篇文章,才发现,之前只是写了一个开头,然后就没写了.哎,确实懒了,这次也算对自己这半年工作经验的总结,如果哪里有问题,希望大家积极指出.在随后的文章里,我会把我这两个月工作之余,写的一个自我笔记,也给大家分享一下.您能在

  10. Flutter GetX 实现 ChatGPT 简单聊天界面 - 2

    Flutter是一款跨平台的移动应用开发框架,而GetX是Flutter中一种简单易用的状态管理和路由管理工具。本篇我们将使用Flutter和GetX实现一个简单的聊天界面,以与ChatGPT进行交互。我们需要在Flutter项目中引入GetX库。在pubspec.yaml文件中添加以下依赖:dependencies:flutter:sdk:flutterget:在main函数中添加以下代码:voidmain(){//在main函数第一行添加这句话WidgetsFlutterBinding.ensureInitialized();runApp(GetMaterialApp(home:ChatP

随机推荐