【问题标题】:Flutter - Dispose of resources and monitor number of instances of resourcesFlutter - 处理资源并监控资源实例的数量
【发布时间】:2021-03-05 03:08:58
【问题描述】:

我需要一些保证,即我不会在不处置它们的情况下创建新对象,或者需要知道如何手动监控和处置它们。我认为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 获取内存中对象的实际实例数,以及如何确保我正在适当地清理资源,尤其是块/cubits?

【问题讨论】:

    标签: flutter dart devtools stack-navigator flutter-bloc


    【解决方案1】:

    您的代码有问题。集团已创建,但没有人处置它。这就是为什么您在控制台中看不到关闭(假设您在 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 次) .通常,它是正确的(实际)数字(假设开发工具没有错误)。但是您应该知道内存快照不是实时的,即它不会实时更改实例的数量。因此,如果您需要查看另一个号码,您将稍后创建一个新快照。并仔细观察新快照的结果,因为旧快照保留在那里,很容易查看错误的快照。看来这就是问题所在。

    【讨论】:

    • 谢谢! “像这样在构建方法中创建 bloc 实例是绝对错误的” - 是指我的代码还是您的解决方案?如果您说您的解决方案仍然不是很有效,我会找到另一种方法。
    • 指的是你的代码。我没有说我的解决方案中有些东西不是很有效。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      相关资源
      最近更新 更多