[英]Flutter Getx How to navigate to other page in StreamBuilder
[英]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 => 无法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;
}
}
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.