我的应用程序中有两个屏幕.

屏幕A在打开时运行计算量很大的操作,并在调用dispose()时通过取消对数据库的动画/订阅来正确处理,以防止内存泄漏.

从屏幕A可以打开另一个屏幕(屏幕B).

当我使用Navigator.pushNamed时,屏幕A保留在内存中,并且不调用dispose(),即使现在显示了屏幕B.

有没有办法在屏幕A不可见时强制将其丢弃?

从不释放第一个路由的示例代码:

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    title: 'Navigation Basics',
    home: FirstRoute(),
  ));
}

class FirstRoute extends StatefulWidget {
  @override
  _FirstRouteState createState() => _FirstRouteState();
}

class _FirstRouteState extends State<FirstRoute> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('First Route'),
      ),
      body: RaisedButton(
        child: Text('Open route'),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => SecondRoute()),
          );
        },
      ),
    );
  }

  @override
  void dispose() {
    // Never called
    print("Disposing first route");
    super.dispose();
  }
}

class SecondRoute extends StatefulWidget {
  @override
  _SecondRouteState createState() => _SecondRouteState();
}

class _SecondRouteState extends State<SecondRoute> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Route"),
      ),
      body: RaisedButton(
        onPressed: () {
          Navigator.pop(context);
        },
        child: Text('Go back!'),
      ),
    );
  }

  @override
  void dispose() {
    print("Disposing second route");
    super.dispose();
  }
}

推荐答案

我知道现在有点晚了,但我认为您应该重写deactivate方法.因为我们正在更改页面,所以实际上并没有 destruct 它,这就是dispose没有被调用的原因.

如果您想了解更多关于有状态小部件生命周期的信息.

从链接:

"deactivate()"在从树中删除State时调用,但它可能是 在当前帧更改完成之前重新插入.这种方法基本上是存在的. 因为状态对象可以从树中的一点移动到另一个点.

Flutter相关问答推荐

如果文档确实存在,则FiRestore将";False";返回到";if-Document-Existes";...还是我说错了?

为什么要在值列表中两次放入空安全性

从超级应用程序启动时,Flutter 小应用程序中未加载资源

在 flutter 吧蜂巢中拯救主题

如何在Flutter 安全存储器中存储对象值?

如何在 Flutter 中创建厚度沿着容器逐渐减小的边框

没有固定宽度的小部件可以约束文本小部件吗?

Flutter - Riverpod 2.0 - 如何访问 onDispose 回调?

Flutter http 请求获取 null

无法在 Flutter 项目中安装最新版本的 image_picker

创建混合 TextWidget 和 TextFieldWidget

Elevated 和 Outlined 按钮之间的动画

为什么 ref.watch(otherProvider.stream) 在 Riverpod 2.x 中被弃用并且将在 3.x 中被删除?

当我使用 Confetti Widget 时,Flutter Android 和 IOS 应用程序崩溃

Flutter/Dart - 从外部类更新状态

我可以使用 Future 来填充Text() 小部件而不是在 Flutter 中使用 FutureBuilder 吗?

如何在 SingleChildScrollView 小部件中管理自定义小部件状态

为什么这个循环只发生一次?Flutter /dart

如何在 ElevatedButton 上设置背景 colored颜色 动画?

如何验证位于 PageView 内不同页面的 TextFormFields