Flutter GetX: Get.put在小部件中放置的位置?

4

我对GetX并不熟悉,正在尝试学习如何使用它。我已经阅读了一些不同的教程,一些将控制器在widget的build方法外部注入,而其他人则将其放在内部

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

  //Outside...
  final controller = Get.put(Controller()); //<---

  @override
  Widget build(BuildContext context) {
    //Inside...
    final controller = Get.put(Controller()); //<---

    return Obx(
      () => Text(controller.name)
    );
  }
}

这两个位置有什么区别吗?如果有,为什么呢?

StatefulWidget中应该放在哪里?它似乎不应该放在build方法中,因为这会导致栈溢出错误。

Get.put()在小部件中的位置是否重要?

4个回答

3
正常的做法是将控制器放在小部件外面,这样它只会被创建一次。如果你将其放在小部件里面,每次刷新(更新)小部件时都会创建一个新的控制器实例。 此外,使用 GetX 时无需使用 StatefulWidget

2
如果我们想要将一个GetX控制器永久保留在内存中,那么我们确实应该在Widget的`build()`函数之外进行实例化(例如像Clifton展示的那样在`main()`函数中进行实例化)。
(请注意,我们还可以使用`GetXService`来获取持久控制器,这允许手动处理。)
当我们希望GetX在widget超出范围时释放内存并且处置控制器时,将控制器放置在`build()`函数中是正确的位置。 (例如,当用户从堆栈中“弹出”路由时。)在`build()`内部实例化控制器时,“重新创建”控制器也没有危险:当调用`Get.put()`时,Get会检查控制器的存在,并跳过它如果控制器已经被实例化。
有关为什么我们应该在`build()`内部使用`Get.put()`的更多信息,请参见this answer(以及Get的维护者之一的解释)。

1

当您将它放在build方法内部时,它会在每次重建小部件时创建一个新实例,因此最好将其放在外部,在大多数情况下,我认为您甚至不需要在动画中使用StatefulWidgetGetX


1
答案都是正确的。谢谢!我想发表另一个答案,我认为这是更好的方法,因为它在文档中有所提及
这种方法允许控制器访问而无需在任何小部件中放置Get.put。如果您拥有许多控制器并且需要从小部件以及其他控制器中引用它们,这也非常有帮助。
以下是一个例子:
//ControllerA
class ControllerA extends GetxController {
  static ControllerA get to => Get.find();

  final name = 'Bob'.obs;

  someMethod(){
    ControllerB.to.anotherMethod(); //'I am inside ControllerB!'
  }
}

//ControllerB
class ControllerB extends GetxController {
  //+++
  static ControllerB get to => Get.find();

  anotherMethod(){
    print('I am inside ControllerB!');
  }
}

然后在小部件内:

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

  @override
  Widget build(BuildContext context) {

    return Obx(
      () => Text(ControllerA.to.name) //Bob
    );
  }
}

这需要您在main.dart中添加Get.put声明,以确保它们都准备好了:
void main() {
  Get.put(ControllerA());
  Get.put(ControllerB());

  runApp(
    GetMaterialApp(...)
  );
}

在我看来,这样做真的很简洁 - 而且非常方便!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接