Flutter中GetBuilder 和 GetX 的区别

在 GetX 框架中,GetBuilder 和 GetX 都是用来构建响应式 UI 的,但它们在使用方式和适用场景上有一些不同。

  1. GetBuilder
    作用: 用于监听控制器中的特定变量变化并重新构建部分 UI。
    特点:
    只有当 update() 方法被调用时,才会触发 UI 的重建。
    适用于需要手动控制 UI 更新的场景。
    适合用于复杂的 UI 组件,可以更细粒度地控制哪些部分需要更新。
    示例代码:
class MyController extends GetxController {
  var count = 0;

  void increment() {
    count++;
    update(); // 手动调用 update() 方法
  }
}

class MyHomePage extends StatelessWidget {
  final MyController controller = Get.put(MyController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GetBuilder Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            GetBuilder<MyController>(
              builder: (controller) {
                return Text(
                  'Count: ${controller.count}',
                  style: TextStyle(fontSize: 24),
                );
              },
            ),
            ElevatedButton(
              onPressed: controller.increment,
              child: Text('Increment'),
            ),
          ],
        ),
      ),
    );
  }
}

  这和原生android中LiveData使用有很大的相似性,其中update方法的作用仅仅只是通页面进行更新,并不是只更新increment方法中提到的count,若MyController 存在其他已变更的值,也会一同在页面上更新,如下例所示。

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

class MyController extends GetxController {
  var count = 0;

  var time = 0;

  void test() {
    time++;
  }

  void increment() {
    count++;
    update(); // 手动调用 update() 方法
  }
}

class MyHomePage extends StatelessWidget {
  final MyController controller = Get.put(MyController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GetBuilder Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            GetBuilder<MyController>(
              builder: (controller) {
                return Text(
                  'Count: ${controller.count}',
                  style: TextStyle(fontSize: 24),
                );
              },
            ),
            GetBuilder<MyController>(
              builder: (controller) {
                return Text(
                  'Time: ${controller.time}',
                  style: TextStyle(fontSize: 24),
                );
              },
            ),
            ElevatedButton(
              onPressed: controller.increment,
              child: Text('Increment'),
            ),
            ElevatedButton(
              onPressed: controller.test,
              child: Text('Test'),
            ),
          ],
        ),
      ),
    );
  }
}

  当我们先点击一次Test按键时,time的值已经变更为1,但由于页面未更新,页面上time显示的值仍为0,此时我们点击Increment按钮,会发现页面上time和count同时变更为1了。
2. GetX
作用: 用于监听控制器中的响应式变量变化并自动更新 UI。
特点:
当响应式变量(使用 .obs 标记)发生变化时,会自动触发 UI 的重建。
适用于简单的 UI 组件,可以自动管理状态的变化。
代码更加简洁,不需要手动调用 update() 方法。
示例代码:

class MyController extends GetxController {
  var count = 0.obs; // 使用 .obs 将变量变为响应式

  void increment() {
    count.value++; // 直接修改响应式变量的值
  }
}

class MyHomePage extends StatelessWidget {
  final MyController controller = Get.put(MyController());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GetX Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Obx(() => Text(
                  'Count: ${controller.count.value}',
                  style: TextStyle(fontSize: 24),
                )),
            ElevatedButton(
              onPressed: controller.increment,
              child: Text('Increment'),
            ),
          ],
        ),
      ),
    );
  }
}