首页 > 解决方案 > 在颤振导航器上启动另一个页面时如何调用析构函数?

问题描述

  Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => MyNewPage()),
  )

这会加载一个新页面。

我怎样才能使它在当前页面上调用一个析构函数,以便它可以正确地清除它的东西?

我尝试添加一个 dispose 方法,但是当我更改页面时它没有执行。

标签: flutterdart

解决方案


要清除整个当前上下文,您可以使用:

 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:该函数将在处理完页面的所有相关对象(控制器、视图等)后立即调用。

推荐阅读