当前位置: 首页 > 知识库问答 >
问题:

flutter - 为何在 GetBinding 中使用 Get.create() 导致 Controller 不断重复创建?

欧阳炜
2024-08-30

在Getbinding中使用Get.create()注入依赖时,会一直不停地创建Controller,(使用断点可以发现一直在执行OnReady和OnInit)

Get.toNamed(Routes.MUSICLIST, arguments: arguments, preventDuplicates: false);
import 'package:get/get.dart';

import '../controllers/musiclist_controller.dart';

class MusiclistBinding extends Bindings {
  @override
  void dependencies() {
    Get.create<MusiclistController>(() => MusiclistController());
  }
}

尝试使用Get.put或Get.lazyput注入依赖就没有问题,但我需要打开多个相同的页面

共有1个答案

秦楚
2024-08-30

在 GetX 框架中,Get.create() 方法的行为是每次请求时都会创建一个新的实例。这是因为它主要用于那些需要每次访问时都是全新实例的场景。然而,在你的场景中,你似乎想要在同一页面或路由的多个实例之间共享同一个 MusiclistController 实例,这通常是通过使用 Get.put()Get.lazyPut() 来实现的。

为什么 Get.create() 导致不断重复创建?

当你使用 Get.toNamed() 导航到相同的路由时,如果 preventDuplicates 设置为 false(如你所做),并且你使用 Get.create() 来创建控制器,那么每次导航到该路由时,都会通过 Get.create() 调用创建一个新的 MusiclistController 实例。这是因为 Get.create() 设计的初衷就是每次调用时都生成一个新的实例。

解决方案

如果你需要确保相同的路由或页面在多次导航时共享同一个控制器实例,你应该使用 Get.put()Get.lazyPut()。这两个方法之间的主要区别在于初始化时机:

  • Get.put():在调用时立即初始化控制器。
  • Get.lazyPut():控制器在第一次被请求时初始化,之后的请求将返回相同的实例。

对于你的场景,使用 Get.put()Get.lazyPut() 是更合适的选择,因为你可以确保无论用户如何导航,他们都将与同一个 MusiclistController 实例交互。

示例

MusiclistBinding 中使用 Get.put()Get.lazyPut()

import 'package:get/get.dart';

import '../controllers/musiclist_controller.dart';

class MusiclistBinding extends Bindings {
  @override
  void dependencies() {
    // 使用 Get.put() 或 Get.lazyPut() 替换 Get.create()
    Get.put<MusiclistController>(MusiclistController());
    // 或者
    // Get.lazyPut<MusiclistController>(() => MusiclistController());
  }
}

确保你的路由配置或页面初始化逻辑正确地引用了这些绑定,以便在需要时注入控制器。

这样修改后,无论用户如何导航到 Routes.MUSICLIST,他们都将与同一个 MusiclistController 实例进行交互,避免了不必要的重复创建和可能的性能问题。

 类似资料:
  • 我正在尝试在这样的笔记本中运行应用程序的最简单演示。 我第一次运行它时,一切都很好。然后我用中断了单元格。但是下次我运行它时,笔记本会返回一些错误消息,如下所示: 然后我得到以下回溯: 没有告诉我太多,所以我查看了我开始的cmd,看到了这个:Traceback(最近的最后一次调用): 似乎iPython笔记本服务器没有正确处理我的中断。但是,当我试图寻找侦听端口5000的ghost进程时,我一无所

  • < code>onIncomingCall()是来自第三方库< code>pjsip中的类的重写方法。当使用SIP进行传入呼叫时,调用此方法。不知何故,这个方法使得只有当呼叫应答代码在同一个方法中或者在同一个方法中被调用时,呼叫才有可能被应答。但是我希望当用户按下按钮时,电话被接听。我已经创建了一个回调函数,并让用户在呼叫到来时按下按钮,但是如果在< code>onIncomingCall()方法

  • 我遇到了一个问题,创建选项卡的请求导致重复的字段相互堆叠。我已经在我的应用程序和邮递员中测试了这一点。

  • 注意:这个问题可能看起来像一个重复的问题,但它不是/尝试了所有的修复,但仍然不起作用!(如果你读了这个问题,你会知道为什么) 我有一个Firebase函数项目,我的文件夹结构是这样的, 所以,当我运行这个命令时, 它试图部署,但在控制台中显示了这一点, 显然,这个错误没有帮助,所以我进入firebase-dubug.log寻找问题的确切原因,发现了这个, 所以,我认为这个错误是由于没有把“类型”:

  • 问题内容: 我正在开发一个具有投票权的在线画廊,并且有一个单独的图片和投票表(对于每一次投票,我都会存储图片的ID和投票者的ID)。这些表的相关关系如下:。我想查询图片表并按投票数对输出进行排序。这就是我要做的: 当然,不同页面的偏移量也不同。 但是,有些具有相同ID的图片会显示在不同的页面上。我想原因是排序,但无法构造任何更好的查询,这将不允许重复。有人可以给我一个提示吗? 提前致谢! 问题答案

  • 我使用以下查询创建了一个带有Sequence.NextVal的表,

  • 问题内容: 我对Java线程技术比较陌生,并且我注意到,每次使用Thread.sleep()时,我都必须捕获InterrupetdException。 哪种行为会导致这种情况,并且在具有监视器线程的简单应用程序中,我可以忽略该异常吗? 问题答案: 好吧,如果其他一些线程调用thread.interupt(),则在该线程处于休眠状态时,您将获得Exception。是的,您可能只需将try..catc

  • 了解如何使用重复网格在 Adobe XD 中创建重复元素。 在针对 Web 或移动应用程序进行设计时,通常需要定义重复元素或内容列表。但是,创建这些元素或在发生设计更改时进行更新可能很耗时。 “重复网格”功能将一组元素更改为一个重复元素。您只需按任意方向拉元素,网格就会重复。在修改某个元素的任何样式时,将在网格的所有元素中复制此更改。例如,如果更改某个元素中的图像大小,则将自动调整网格中所有图像的