flutter 如何在视图中使用GetxController而不删除构造函数上的const关键字

wlwcrazw  于 2022-11-30  发布在  Flutter
关注(0)|答案(1)|浏览(174)

使用Getx时,当我有一个GetxController并且我想在视图UI中使用它时,需要删除小部件构造函数上的const
控制器:

class TestController extends GetxController {
// ...
}

查看方式:

class TextWidget extends StatelessWidget {
  const TextWidget({super.key}); //  throws error
   final controller = Get.put(TestController());
  
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

它会在const行上抛出一个错误:

> Can't define the 'const' constructor because the field 'controller' is initialized with a non-constant value.

因此它要求我删除const,但由于建议添加const以获得更好的性能,所以我希望让它存在并使用我的控制器。
我可以通过在build()方法中声明控制器来关闭这个错误,但我想这不是一个好主意。

ovfsdjhp

ovfsdjhp1#

build()方法中声明控制器将导致额外的不必要的Get.put(),每次小部件重建时都会调用这些Get.put()
不要像下面这样将控制器作为变量调用:

final controller = Get.put(TestController());

您可以使用getter来获得GetxController,以防止出现此错误,并让您的小部件为const,如下所示:

TestController get controller => Get.put(TestController());

您现在可以使用控制器,就像您将其声明为final一样,而您的小部件仍然是const
也可以考虑使用GetView<T>,因为它可以实现同样的效果:

class TextWidget extends GetView<TestController> {
  const TextWidget({super.key});
  @override
  Widget build(BuildContext context) {
    return Text("${controller.index}"); // use controller directly to access controller.
  }
}

您只需使用GetView<T>指定控制器的泛型类型,然后就可以使用controller getter引用该控制器,而无需手动定义它。

相关问题