FlutterGETX:如何在每次导航到其他页面/路线时删除初始化控制器

rvpgvaaj  于 2022-12-24  发布在  Flutter
关注(0)|答案(8)|浏览(873)

新手在这里。我如何重新运行onInit()每次我推回我的屏幕?onInit()只运行一次,但导航回上一个屏幕不会删除已初始化的控制器(FetchData)嗯..
我只在每次要弹出页面时使用Get.back(),在每次要在命名路径上导航时使用Get.toNamed()
我唯一希望发生的事情是删除初始化控制器(FetchData)每次我弹出页面,但我不知道如何做到这一点。
我的Getx控制器

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;
    }
}

先谢了!

9rnv2umw

9rnv2umw1#

当我注销时,Get.off、Get.offUntil、Get.offAndToNamed方法不会从内存中删除我的GetXController。
然后我试了下面的代码,一切都很好。

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

2admgd592#

您可以用途:

Get.delete<FetchData>();
7rfyedvj

7rfyedvj3#

不能将方法fetchData()放在super.onInit()上。当您使用Get.offAllName()Get.offAndToName()Get.offAll()等时...方法fetchData()仍保留在内存中=〉不能将它放在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;
   }
}
cidc1ykv

cidc1ykv4#

您可以使用

Get.offAndToNamed(url)
m4pnthwp

m4pnthwp5#

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

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

如果你只想在某些情况下调用这个方法,你可以传回一个bool来询问是否需要reload:

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();
ncecgwcz

ncecgwcz6#

您可以使用

Get.deleteAll();

这将从内存中删除所有*******初始化的控制器示例

roejwanj

roejwanj7#

使用Get.offAllNamed。它将删除所有控制器,只创建最终目的地路由控制器。第四章第三节第八节

Get.offAllNamed("your final route");
tsm1rwdh

tsm1rwdh8#

简单的答案是Get.delete<FetchData>();,如果您创建了类似Get.put(FetchData())的内容
但是,如果您创建了类似Get.put(FetchData(), permanent: true);或由LazyPut创建的内容,则可以通过强制Get.delete<FetchData>(force: true);删除该内容
希望这对你有帮助。

相关问题