【问题标题】:How to force Dart/Flutter to reuse same class with same properties如何强制 Dart/Flutter 重用具有相同属性的相同类
【发布时间】:2020-03-03 15:16:12
【问题描述】:

我的问题很简单,我有一个像这样的 Dart 类

import 'package:equatable/equatable.dart';
import 'package:meta/meta.dart';

class Weather extends Equatable {
  final String cityName;
  final double tempCelsius;
  final double tempFahrneit;

  const Weather({
    @required this.cityName,
    @required this.tempCelsius,
    this.tempFahrneit,
  });

  @override
  List<Object> get props => [
        cityName,
        tempCelsius,
        tempFahrneit,
      ];
  @override
  String toString() {
    return [
      cityName,
      tempCelsius,
      tempFahrneit,
    ].toString();
  }
}

我正在使用 Equatable 来简化对象比较,我还在类构造函数上使用了 const 关键字(不确定我在类构造函数上使用时是否听说过,如果它有在实例化之前具有相同属性的相同类)。

当我在 DevTools 上查找时,我总是在调用一个函数时得到多个类实例,尽管它总是相同的参数,并且垃圾收集器会保持它的事件,尽管我弹出/销毁视图(Flutter 上下文中的脚手架)。

现在我只是用一个小类测试它,但如果它是一个大类,这将是一团糟,即使我认为在这种情况下垃圾收集器肯定会处理未使用的类,但我想知道我是否可以通过某种 Dart/Flutter 方式解决这个“问题”。

【问题讨论】:

  • 当我在某处使用带有文件名的导入并在其他地方使用包导入时,我有明显的重复类。甚至两份静态数据。
  • 你确定在构造时使用了 const 吗?喜欢:var weather = const Weather(...)
  • 是的,就是这样,为了做到这一点,参数也需要是 const,但在收集数据时在运行时动态传递。

标签: class memory flutter dart garbage-collection


【解决方案1】:

如果您使用const Weather(...) 创建对象,您应该不会再看到多个实例。

观察垃圾收集器通常不是一个好主意,您可以相信它会在 GC 算法到达时销毁您的对象。

Dart 的垃圾收集器针对创建许多小对象并将它们一起丢弃而进行了优化。因此,您可能根本不必担心这一点。

【讨论】:

  • 问题是在我的情况下,构造函数的参数是在运行时动态传递的,因此我不能使用这个表达式。
  • 那么你将不得不为你的类的多个实例提供多个对象。如果真的想共享对象,可以写一个复用对象的工厂方法:dart.dev/guides/language/language-tour#factory-constructors
  • 谢谢!工厂真的是这个案例的解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
相关资源
最近更新 更多