繁体   English   中英

Flutter GETX:每次我们导航到其他页面/路由时如何删除初始化控制器

[英]Flutter GETX: How to remove Initialized Controller every time we navigate to other page/routes

新手在这里。 每次推回屏幕时如何重新运行 onInit()? onInit() 只运行一次,但导航回上一个屏幕不会删除已初始化的控制器 ( FetchData ) 嗯……

每次我想弹出页面时,我只使用Get.back() 每次我想在命名路线上导航时,我只使用 Get.toNamed()

我唯一想做的就是每次弹出页面时删除初始化控制器( FetchData ),但我不知道该怎么做。

我的控制器

class FetchData extends GetxController {
    RxList items = [].obs;
    @override
    onInit() {
      fetchData();
      super.onInit();
    }
    
    Future<void> fetchData() async {
     var result = await http.get("api.url");
     items.value = result.body;
    }
}

提前致谢!

我使用没有 nullsafety 的 getx 版本 3.25.6,当我注销 Get.off、Get.offUntil、Get.offAndToNamed 方法时,不会从 memory 中删除我的 GetXController。

然后我尝试了下面的代码,一切正常。

 Get.offUntil(GetPageRoute(page: () => Login()), ModalRoute.withName('toNewLogin') );
   
     Timer(Duration(milliseconds: 300), ()=>Get.delete<MainPageController>());

您不能将方法fetchData()放在super.onInit()上。 当您使用Get.offAllName()Get.offAndToName()Get.offAll()等...方法fetchData()仍保留在 memory => 无法disposeclose它。

使固定:

class FetchData extends GetxController {
   RxList items = [].obs;
   @override
   onInit() {
     super.onInit(); // <--- swap code here
     fetchData(); // <--- swap code here
   }

   Future<void> fetchData() async {
      var result = await http.get("api.url");
      items.value = result.body;
   }
}

onInit 只被调用一次。 当从另一个屏幕返回时,您可以使用另一种方法运行,例如,当调用新屏幕时,您可以等待它关闭,然后再次调用您的方法:

//go to new screen
await Get.toNamed(screenName);
//after run my method
controller.fectchData();

如果您只想在某些情况下调用该方法,您可以返回一个布尔值来询问是否需要重新加载:

Get.back(result: true);

并在屏幕上调用:

//go to new screen
final result = await Get.toNamed(screenName);
    
if(result != null && result == true)//after run only if needed
controller.fectchData();

您可以使用

Get.deleteAll();

这将从 memory中删除所有初始化的控制器实例

您可以使用

Get.offAndToNamed(url)

使用 Get.offAllNamed。 它将删除所有控制器并仅创建最终目标路由 controller。 使用 get 测试:^4.3.8

        Get.offAllNamed("your final route");

您可以使用:

Get.delete<FetchData>();

简单的答案是Get.delete<FetchData>(); 如果您创建了Get.put(FetchData())

但是如果你创建了Get.put(FetchData(), permanent: true); 或者通过LazyPut ,您可以通过强制删除它Get.delete<FetchData>(force: true);

我希望这可以帮助你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM