Flutter GetX - 如何管理控制器删除?

问题描述 投票:0回答:3

我有一个带有

GetX
控制器的 Flutter 应用程序。该应用程序有 6 个屏幕,每个屏幕都有其
GetxController

屏幕 1 和 2 用于登录系统,而屏幕 3 至 6 用于应用程序内容。

登录后,用户可以在屏幕 3-4-5 之间前进和后退,但是当他到达屏幕 6 时,他只能转到屏幕 3,并且必须删除之前的所有堆栈(因此他无法返回)。

1st problem
:如果我从屏幕 6 执行
Get.offAll(() => const Screen3())
,屏幕 3 的控制器将被删除,并且不再起作用。我的解决方法(不知道这个词是否存在!:D)通过将
Controller3
标记为永久 via

Get.put(Controller3(), permanent: true)

但是来了

2nd problem
:如果用户按下
logout
按钮(仅出现在屏幕 3 中),这次我需要删除
Controller3
。这次,调用
Get.offAll
不会删除控制器,也不会调用
Get.delete<Controller3>()
,因为它说

“Controller3”已被标记为永久,SmartManagement无权删除它。

我陷入这样的境地,我真的不知道该怎么办

flutter dart controller flutter-getx
3个回答
8
投票

所以

Getx
正如你所说,让我们像这样制作一个
GetxController
永久:

Get.put<Controller3>.put(Controller3(), permanent: true);.

您无法正常删除它:

Get.delete<Controller3>();

但是您可以选择删除标有

permanent
的控制器,方法是使用
force
属性强制删除,如下所示:

Get.delete<Controller3>(force: true);

force
即使标记为永久也会删除实例。


2
投票

第一个问题:如果我从 Screen 6 执行 Get.offAll(() => const Screen3()),Screen3 的控制器将被删除,并且不再起作用。

我没有得到引用的部分。当你从 6 --> 3 路由时,绑定机制应该再次生成屏幕 3 的控制器。

顺便说一下,您可以使用 with 在任何地方手动制作它

 var controller = Get.put(SomeController());
 controller.dispose();

0
投票

在我的具体场景中,我使用的是

GetBuilder

假设我们有一个名为

GetxController
SomeController

问题是,每当我

onDelete
屏幕显示
SomeController
中给出的
pop
时,
SomeController
GetBuilder
就会自动调用。因此,经过一番研发后,我发现有一个名为
autoRemove
的布尔值,其默认值为
true
。基本上,每当其
context
从堆栈中删除时,它就会删除其控制器。解决方法很简单,将其设置为a
utoRemove: false
,示例代码如下:

GetBuilder<SomeController>(
      autoRemove: false,
      builder: (controller) {
        return SizedBox();
      },
    );
© www.soinside.com 2019 - 2024. All rights reserved.