当前位置: 首页 > article >正文

Flutter 状态管理库-----GetX(一)

Flutter 状态管理库-----GetX(一)

一、GetX特点
  1. 状态管理
    • GetX 提供了非常简洁的 API 来管理 Flutter 中的状态。它可以通过 GetX()Obx() 来监听和更新界面。通过响应式编程,GetX 可以在数据变化时自动更新 UI。
    • 它避免了传统的 Flutter 状态管理方法(如 setStateProvider)中可能出现的复杂性和冗余代码。
  2. 路由管理
    • GetX 提供了简单且强大的路由管理功能。你可以通过 Get.to()Get.back() 等方法实现页面跳转。它也支持命名路由、参数传递和动态路由等功能。
    • 它支持路由的简单声明和快速导航,不需要使用 Navigator 或其他复杂的路由设置。
  3. 依赖注入
    • GetX 还提供了依赖注入(DI)功能。通过 Get.put()Get.find(),你可以方便地将对象注入到你的应用中,无需手动管理对象生命周期。
  4. 高效的性能
    • GetX 在更新 UI 时通过响应式编程减少不必要的重建,只更新那些需要变化的部分,这使得它的性能非常高。
    • GetX 采用懒加载的方式,只有在需要时才会创建对象,这样可以进一步提高应用的性能。
  5. 简单易用
    • GetX 强调易于使用,减少了很多样板代码。它的语法简洁明了,非常适合快速开发。
二、GetX引入

1.命令行引入

flutter pub add get

2.配置文件引入

dependencies:
  get: ^4.7.2
三、使用案例
1.状态管理(Reactive State Management)

GetX 通过 .obsObx 实现响应式编程,自动更新 UI。

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

class CounterController extends GetxController {
  var count = 0.obs;  // 使用.obs创建响应式变量

  void increment() {
    count++;
  }
}

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

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('GetX Example')),
        body: Center(
          child: GetX<CounterController>(  // 使用GetX来监听状态变化
            init: CounterController(),    // 初始化控制器
            builder: (controller) {
              return Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text('Count: ${controller.count}'),
                  ElevatedButton(
                    onPressed: controller.increment, // 增加计数
                    child: Text('Increment'),
                  ),
                ],
              );
            },
          ),
        ),
      ),
    );
  }
}

2.依赖注入(Dependency Injection)

GetX 提供了便捷的依赖注入方法。

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

class MyService extends GetxService {
  void printMessage() {
    print('Hello from MyService!');
  }
}

void main() {
  // 初始化依赖注入
  Get.put(MyService()); // 将 MyService 注入到 GetX 的依赖管理中
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('GetX Dependency Injection')),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 获取 MyService 实例并调用方法
              Get.find<MyService>().printMessage();
            },
            child: Text('Call Service'),
          ),
        ),
      ),
    );
  }
}

3.路由管理(Routing)

GetX 提供了非常简便的路由管理方法。

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

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

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
      navigatorKey: Get.key, // 使用 GetX 提供的 navigatorKey
    );
  }
}

class HomeScreen extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('GetX Routing')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 使用 Get.to() 跳转到其他页面
            Get.to(SecondScreen());
          },
          child: Text('Go to Second Screen'),
        ),
      ),
    );
  }
}

class SecondScreen extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Second Screen')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 使用 Get.back() 返回上一页
            Get.back();
          },
          child: Text('Go Back'),
        ),
      ),
    );
  }
}

4. 路由命名与参数传递(Named Routes & Arguments)

GetX 支持命名路由和通过路由传递参数。

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

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

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      initialRoute: '/',
      getPages: [
        GetPage(name: '/', page: () => HomeScreen()),
        GetPage(name: '/details', page: () => DetailScreen()),
      ],
    );
  }
}

class HomeScreen extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('GetX Named Routes')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 通过命名路由跳转并传递参数
            Get.toNamed('/details', arguments: 'Hello from Home!');
          },
          child: Text('Go to Details'),
        ),
      ),
    );
  }
}

class DetailScreen extends StatelessWidget {
  
  Widget build(BuildContext context) {
    // 获取路由传递的参数
    final message = Get.arguments ?? 'No message passed';
    return Scaffold(
      appBar: AppBar(title: Text('Detail Screen')),
      body: Center(
        child: Text(message),
      ),
    );
  }
}

5.页面生命周期管理

GetX 提供了对页面生命周期的管理方法,可以通过生命周期钩子来执行某些操作。

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

class LifecycleScreen extends StatelessWidget {
  
  Widget build(BuildContext context) {
    // 使用GetX的生命周期钩子
    Get.log('LifecycleScreen created');
    return Scaffold(
      appBar: AppBar(title: Text('GetX Lifecycle')),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Get.back();
          },
          child: Text('Go Back'),
        ),
      ),
    );
  }

  
  void dispose() {
    Get.log('LifecycleScreen disposed');
    super.dispose();
  }
}

6.Snackbar, Dialog, BottomSheet

GetX 提供了简洁的方式来显示 Snackbar、Dialog 和 BottomSheet。

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

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

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('GetX Snackbar, Dialog, BottomSheet')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                // 显示Snackbar
                Get.snackbar('Title', 'This is a snackbar');
              },
              child: Text('Show Snackbar'),
            ),
            ElevatedButton(
              onPressed: () {
                // 显示Dialog
                Get.dialog(
                  AlertDialog(
                    title: Text('This is a Dialog'),
                    content: Text('Hello from GetX dialog'),
                    actions: [
                      TextButton(
                        onPressed: () => Get.back(),
                        child: Text('Close'),
                      ),
                    ],
                  ),
                );
              },
              child: Text('Show Dialog'),
            ),
            ElevatedButton(
              onPressed: () {
                // 显示BottomSheet
                Get.bottomSheet(
                  Container(
                    padding: EdgeInsets.all(20),
                    color: Colors.white,
                    child: Center(child: Text('This is a BottomSheet')),
                  ),
                );
              },
              child: Text('Show BottomSheet'),
            ),
          ],
        ),
      ),
    );
  }
}


http://www.kler.cn/a/552640.html

相关文章:

  • 微机控制电液伺服汽车减震器动态试验
  • 淘宝拍立淘按图搜索商品API接口概述及JSON数据示例返回
  • 【核心算法篇七】《DeepSeek异常检测:孤立森林与AutoEncoder对比》
  • 基于SpringBoot畅购行汽车购票系统
  • Qt——连接MySQL数据库之编译数据库驱动的方法详细总结(各版本大同小异,看这一篇就够了)
  • Ubuntu设置docker代理报网络错误
  • 一文读懂Docker之Dockerfile基本使用
  • 【简历优化】性能调优 — 基础概念篇
  • 高子昂医编---23岁,医疗编上岸,正式开启养老生活
  • 网络安全示意图 网络安全路线图
  • 深度学习笔记——LSTM
  • git 如何显示特定作者的提交历史?
  • 机器学习:k近邻
  • 巧用 PasteMate,联合 DeepSeek 与 LaTeX 高效生成 PDF 文档
  • C#中的图形渲染模式
  • 后端生成二维码,前端请求接口生成二维码并展示,且多个参数后边的参数没有正常传输问题处理
  • 个人shell脚本分享
  • 记一次 Git Fetch 后切换分支为空的情况
  • 【C++笔记】C++11的深度剖析(二)
  • GIT提错分支,回滚提交