在 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
实例进行交互,避免了不必要的重复创建和可能的性能问题。
这个文档有说明:
Get.create每次都会创建新的
使用Get.lazyPut 结合 Get.find 来用