Flutter - 处理资源并监控资源实例数

Flutter - Dispose of resources and monitor number of instances of resources

我需要一些保证,我不会在不处理它们的情况下创建新对象,或者需要知道如何手动监视和处理它们。我认为 Navigator.pop() 应该处理我的资源,例如 flutter-bloc cubits/blocs 但它似乎并不像它那样。

我像这样使用 onGenerateRoute 为命名路线提供一肘:

在 onGenerateRoute 中:

  case Routes.LOGGED_OUT_NICKNAME:
    page = MyCustomRouteTransitionAnimation<LoggedOutNickNameView>(
      builder: (context) => BlocProvider.value(
          value: LoggedOutNickNameCubit(
              SaveNickNameLocallyUseCase(), GetUserFieldFromLocalUseCase()),
          child: LoggedOutNickNameView()),
    );
    break;

我注意到当我导航到路线时,它每次都会创建肘,这很好,但是当我 Navigator.pop() 时,肘没有关闭。

当我在 dart devtools 中监控内存时,无论如何它似乎总是显示 2 个我的 cubit 实例,所以看起来有点无用。我读错了吗?:

如何从 dart devtools 获取内存中对象实例的实际数量,以及如何确保我正确地清理资源,尤其是 blocs/cubits?

你的代码有问题。集团已创建,但没有人处置它。这就是为什么您在控制台中看不到关闭(假设您在 bloc 的 close 方法中有这样一条打印语句)消息的原因。值构造函数 (BlocProvider.value) 仅应在您想要手动管理 bloc 生命周期的情况下使用。这意味着您要在需要时创建它,而在不需要时处置它。您的代码没有(或者您没有提供完整代码)块处理语句。如果你想让 bloc 自动处理自己,你应该使用 BlocProvider 这样的构造函数:

builder: (context) => BlocProvider(
          create: (context) => LoggedOutNickNameCubit(
              SaveNickNameLocallyUseCase(), GetUserFieldFromLocalUseCase()),
          child: LoggedOutNickNameView()),

在这种情况下,如果您使用 Navigator.pop 方法离开页面,您应该会在控制台中看到关闭消息。 像这样在build方法中创建bloc实例是绝对错误的。 build 方法可以被多次调用,这样你的 bloc 也会被重新创建很多次。而且,通常,这不是我们需要的行为。

内存监视器显示快照时内存中有多少实例可用。它显示了 bloc 的 2 个实例,因为正如我之前所说,您的构建方法是错误的:它在每次调用时都会创建一个新的 bloc 实例(并且在快照时您的小部件已至少重建 2 次) .通常,它是正确的(实际)数字(假设开发工具没有错误)。但是您应该知道内存快照不是实时的,即它不会实时更改实例数。因此,如果您需要查看另一个号码,您将在稍后创建一个新快照。并仔细观察新快照的结果,因为旧快照保留在那里,很容易查错。看来是这个问题。

另一种方法是在您的 cubit class 中覆盖 close() 方法并取消订阅或取消该 cubit 中使用的订阅。这给我造成了问题。

@override
Future<void> close() {
  subscription.cancel();
  return super.close();
}