flutter - 在颤振导航器上启动另一个页面时如何调用析构函数?
问题描述
Navigator.push(
context,
MaterialPageRoute(builder: (context) => MyNewPage()),
)
这会加载一个新页面。
我怎样才能使它在当前页面上调用一个析构函数,以便它可以正确地清除它的东西?
我尝试添加一个 dispose 方法,但是当我更改页面时它没有执行。
解决方案
要清除整个当前上下文,您可以使用:
Navigator.of(context)
.pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
MyNewPage()), (Route<dynamic> route) => false)
确保使用始终返回 false 的 RoutePredicate (Route<dynamic> route) => false
。在这种情况下,它会删除所有路由,除了新MyNewPage()
路由入栈。
如果您需要执行一些清理功能
- 您可以调用它覆盖
dispose()
方法:当该对象从树中永久删除时调用它。请记住,在此处调用是错误的,setState
并确保super.dispose()
在覆盖方法时以调用结束您的方法。
@override
void dispose() {
// Your function.
super.dispose();
}
- 您可以调用它来覆盖
initState()
您在堆栈中推送的路由方法:当此对象插入树时调用它。如果您覆盖它,请确保您的方法以调用super.initState()
.
@override
void initState() {
super.initState();
// Your function.
}
- 如果你需要一个
BuildContext
清理函数,你可以使用didChangeDependencies()
:当这个 State 对象的依赖项发生变化时调用它,并且紧随其后initState
,在这里使用它是安全的BuildContext
。子类很少覆盖此方法,因为框架总是在依赖项更改后调用 build。一些子类确实覆盖了这个方法,因为当它们的依赖关系发生变化时,它们需要做一些昂贵的工作(例如,网络获取),而且这些工作对于每次构建来说都太昂贵了。
@override
void didChangeDependencies() {
// Your function.
super.didChangeDependencies();
}
Getx包也有多种插入中间件函数的方法:
- Redirect:在搜索被调用路由的页面时会调用该函数。它需要 RouteSettings 作为重定向到的结果。或者给它 null 并且不会有重定向。
GetPage redirect( ) {
final authService = Get.find<AuthService>();
return authService.authed.value ? null : RouteSettings(name: '/login')
}
- onPageCalled:在创建任何内容之前调用此页面时将调用此函数,您可以使用它来更改页面的某些内容或为其提供新页面。
GetPage onPageCalled(GetPage page) {
final authService = Get.find<AuthService>();
return page.copyWith(title: 'Welcome ${authService.UserName}');
}
- OnBindingsStart:在初始化绑定之前将调用此函数。在这里您可以更改此页面的绑定。
List<Bindings> onBindingsStart(List<Bindings> bindings) {
final authService = Get.find<AuthService>();
if (authService.isAdmin) {
bindings.add(AdminBinding());
}
return bindings;
}
- OnPageBuildStart:在 Bindings 初始化后立即调用此函数。在这里,您可以在创建绑定之后和创建页面小部件之前执行一些操作。
GetPageBuilder onPageBuildStart(GetPageBuilder page) {
print('bindings are ready');
return page;
}
- OnPageBuilt:该函数将在调用 GetPage.page 函数后立即调用,并将为您提供函数的结果。并获取将显示的小部件。
- OnPageDispose:该函数将在处理完页面的所有相关对象(控制器、视图等)后立即调用。
推荐阅读
- python - Openpyxl 次要网格线
- r - 如何合并长度不等的数据框列表?
- java - 如何处理 querydsl 多个模式具有相同的表名?
- kubernetes - 如何将使用 Persistent Volume Claim 的 Kubernetes 部署扩展到 2 个 Pod?
- node.js - 具有多个查询的 MongoDB findOne 返回错误的结果
- python - 使用 Pandas 将数据帧作为 JSON 编码的字典写入文本文件
- c# - 在 C# 中解析 pdf417 aamvaid
- sql - 使用 SQL 计算每组 id 的相关性
- microsoft-graph-api - Outlook 使用 Graph API 添加
- c# - 有没有办法将证书从 azure keyvault 导入 .NET 中的 azure Web 应用程序?