这里是新手。如何在每次返回屏幕时重新运行onInit((?onInit((只运行一次,但导航回上一个屏幕不会删除已初始化的控制器(FetchData(hmmm.
每次我想弹出页面时,我只使用Get.back((,并且Get.toNamed((每次我想在命名路线上导航时
我只想在每次弹出页面时删除Initialized控制器(FetchData(但我不知道怎么做。
我的GetxController
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;
}
}
提前感谢!
您可以使用:
Get.delete<FetchData>();
当我注销Get.off、Get.offUntil、Get.off AndToNamed方法时,不会从内存中删除我的GetXController。
然后我尝试了下面的代码,一切都很好。
Get.offUntil(GetPageRoute(page: () => Login()), ModalRoute.withName('toNewLogin') );
Timer(Duration(milliseconds: 300), ()=>Get.delete<MainPageController>());
onInit只被调用一次。当从另一个屏幕返回时,您可以使用另一种方法运行,例如,当调用新屏幕时,可以等待它关闭,然后再次调用您的方法:
//go to new screen
await Get.toNamed(screenName);
//after run my method
controller.fectchData();
如果你只想在某些情况下调用该方法,你可以传回一个bool,询问是否需要重新加载:
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();
不能将方法fetchData()
放在super.onInit()
上。当您使用Get.offAllName()
、Get.offAndToName()
、Get.offAll()
等时…方法fetchData()
仍保留在内存中=>无法dispose
或close
。
修复:
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;
}
}
您可以使用
Get.deleteAll();
这将从内存中删除所有已初始化控制器实例。
您可以使用
Get.offAndToNamed(url)
使用Get.offAllNamed。它将删除所有控制器,只创建最终目的地路由控制器。测试得到:^4.3.8
Get.offAllNamed("your final route");
如果您创建了类似Get.put(FetchData())
的,那么简单的答案是Get.delete<FetchData>();
但是,如果你已经创建了类似Get.put(FetchData(), permanent: true);
或LazyPut
的内容,你可以通过强制Get.delete<FetchData>(force: true);
来删除它
我希望这对你有帮助。