GetX

GetX的Readme文档介绍

一、什么是 GetX

GetX 是 Flutter 上的一个轻量且强大的解决方案:高性能的状态管理、智能的依赖注入和便捷的路由管理。
GetX有三个基本原则:
1、 性能:GetX 专注于性能和最小资源消耗。GetX 打包后的apk占用大小和运行时的内存占用与其他状态管理插件不相上下。
2、效率:GetX语法简洁,保持了极高的性能,能极大地缩短开发时长。
3、结构:GetX可以将界面、路由、逻辑和依赖完全解耦,用起来更加清晰,代码更容易维护。

二、GetX响应式状态管理器

响应式是一种面向数据流和变化传播的编程范式。GetX处理响应式编程使它变得很简单,使用 Get 的响应式编程就像使用 setState 一样简单。

  • 你不需要创建StreamControllers.
  • 你不需要为每个变量创建一个StreamBuilder。
  • 你不需要为每个状态创建一个类。
  • 你不需要为一个初始值创建一个get。

三、Navigation路由跳转

GetX 进行路由跳转非常的简单,只需要调用Get.to()即可进行路由跳转,GetX为我们封装了Navigation,无需context可进行跳转,并且能很方便的使用跳转动画等。
GetX有两种跳转方式:

1、Navigation—通过to方法进行路由跳转Get.to()
第一步:程序入口设置,要用GetMaterialApp

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: "GetX",
      home: NavigationForNamedExample(),//就是我自己的页面呀
    );
  }
}

第二步:调用to方法

import 'package:flutter/material.dart';
import 'package:flutter_getx_example/NavigationExample/home.dart';
import 'package:get/get.dart';

class NavigationExample extends StatelessWidget {
  GlobalKey<NavigatorState> _navKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("GetX Navigation"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () async {
                Get.to(Home());
              },
              child: Text("跳转到首页"))
          ],
        ),
      ),
    );
  }
}

2、Get.toName()
我们一般会使用第二种方法,getPages中的内容专门写一个类,用来初始所有的路由。
第一步:应用程序入口设置

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: "GetX",
      initialRoute: "/",
      defaultTransition: Transition.zoom,
      getPages: [
        GetPage(name: "/", page: () => MyApp()),
        GetPage(name: "/home", page: () => Home()),
        GetPage(name: "/my", page: () => My(), transition: Transition.rightToLeft)
      ],
      home: NavigationForNamedExample(),
    );
  }
}

第二步:调用toNamed

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

class NavigationForNamedExample extends StatelessWidget {
  GlobalKey<NavigatorState> _navKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("GetX NavigationForNamed"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () async {
                Get.toNamed("/my");
              },
              child: Text("跳转到首页"))
          ],
        ),
      ),
    );
  }
}
优化路由:

1、路由名称管理类

abstract class Routes {
  static const splash = '/splash';
  static const home = '/home'; // 首页
  static const login = '/login'; // 登陆
  static const userReg = '/register'; //会员注册路由
  static const agentReg = '/agentRegister'; //代理注册路由
  static const forgetPwd = '/forgetPwd'; //忘记密码路由
  static const activity = '/activity';
  static const gameInit = '/gameInit'; //游戏加载路由
  static const gameCategory = '/gameCategory'; //电子、棋牌游戏展示路由
  static const article = '/article'; //文章路由
  static const gameWebView = '/gameWebView'; // 进入第三方游戏页面
  static const welfareCenter = '/welfare'; // 进入福利界面
  static const popularize = '/popularize'; // 进入推广界面
  static const maintain = '/maintain'; // 维护界面
}

2、Get初始化路由数组

List<GetPage> routers = [
  GetPage(
    name: Routes.splash,
    page: () => const SplashPage(),
  ),
  GetPage(
    name: Routes.home,
    page: () => const HomePage(),
    binding: HomeBinding(),
  ),
  GetPage(
    name: Routes.maintain,
    page: () => const MaintainPage(),
  ),
  //首页路由
  GetPage(
      name: Routes.login,
      page: () => const LoginPage(),
      binding: LoginBinding()),
  //登陆路由

  GetPage(
    name: Routes.userReg,
    page: () => const RegisterPage(),
    // binding: LoginBinding()
  ),
]

binding对构造器进行统一的初始化,使用的时候不需要我们再次初始化。
Flutter GetX系列教程---国际化配置、依赖注入、Binding

3、调用

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    final _app = AppService.to;
    Intl.defaultLocale = 'zh';
    return GetMaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter App',
      theme: CustomTheme.darkTheme,
      darkTheme: CustomTheme.darkTheme,
      themeMode: ThemeMode.dark,
      initialRoute: Routes.splash,
      getPages: routers, //这里就是所有的路由数组
      defaultTransition: Transition.noTransition,
      transitionDuration: const Duration(milliseconds: 325),
      routingCallback: _app.routingCallBack,
      localizationsDelegates: const [
        FormBuilderLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      onInit: () {
        Get.put(MusicController());
      },
      navigatorObservers: [
        FlutterSmartDialog.observer,
        SentryNavigatorObserver(),
      ],
      builder: (context, widget) {
        return MediaQuery(
          data: MediaQuery.of(context).copyWith(
            textScaleFactor: 1.0,
          ),
          child: FlutterSmartDialog(
            child: widget,
          ),
        );
      },
    );
  }
}

接收上个页面传参:Get.parameters

class NextController extends StatelessWidget{
  GlobalKey<NavigatorState> _navKey = GlobalKey();
  Map argMap = Get.parameters;
  var pra = "zhangsanlisi";
  @override
  Widget build(BuildContext context) {
     print(argMap['name']);
      return Scaffold(
        appBar: AppBar(
          title: Text("下个页面"),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              // Text(argMap["name"]),
              ElevatedButton(
                  onPressed: () async {
                    Get.back(result: pra);//数据回传
                  },
                  child: Text("跳转到首页"))
            ],
          ),
        ),
      );
  }
}

四、Snackbar

如果想在应用程序中触发某些特定的事件后,需要弹出一则快捷消息,那么使用Snackbar则是最佳的选择,接下来我们看一下GetX如何来联调Snackbar来使用。


image.png

Snackbar总共38个属性:


image.png

image.png

五、Dialog

Dialog 底层其实是对AlertDialog进行了封装, 一般用于二次确认的弹出框,比如当点击某个按钮提交资料时,需要用户二次确认,以防止误操作。
按钮内容:

   ElevatedButton(onPressed: (){
                Get.defaultDialog(
                  title:"开车啦",
                  titleStyle:TextStyle(color: Colors.red,fontSize: 20),
                  middleText: "上车一块,老人免票",
                  middleTextStyle: TextStyle(color: Colors.red,fontSize: 14),
                  contentPadding: EdgeInsets.all(10),
                  radius: 20,
                  //两种方法:
                  /* 方法一:
                  textCancel: "取消",//系统
                  textConfirm: "确定",
                  onCancel: (){
                    print("点击了取消");
                  },
                  onConfirm: (){
                    Get.back();
                    print("点击了确定");
                  }
                  */
                   //自定义按钮
                  // confirm: TextButton(onPressed: (){print("点击了确定");}, child: Text("确定")),
                  // cancel:  TextButton(onPressed: (){print("点击了取消");}, child: Text("取消")),
                  //方法二:
                  actions: [
                    ElevatedButton(onPressed: (){
                      Get.back();
                      Get.toNamed('/nextController',parameters: {'name':'zhang'});                 
                      print("点击了取消");
                      }, child: Text("取消")),
                    SizedBox(width: 20,),
                    ElevatedButton(onPressed: (){Get.back();print("点击了确定");}, child: Text("确定"))
                  ]
                );
              }  , child: Text("点击Dialog")),
image.png

Dialog属性和说明:


image.png

内容链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容