传递值使我丢失变量的最后一个值

Pass by value makes me lose last value of variable

提问人:Massau 提问时间:5/12/2023 最后编辑:Ken WhiteMassau 更新时间:5/12/2023 访问量:59

问:

我有两个全局范围变量,一个存储汽车列表,另一个创建 Car 实例

Car car = Car('', '');
List<Car> cars = [];

在表单的每个屏幕上,我将一些信息分配给我的汽车实例的参数,在注册结束时,我将汽车实例分配给一个私有范围变量,并将其添加到将在初始屏幕上显示的汽车列表中

car.fuelPrice = '2,50';

[...]

Car _newCar = Car('', '');
_newCar = car;
cars.add(_newCar);

我的问题是我需要根据已经注册的汽车注册新车,为此我需要修改一些参数的值(例如,我删除了提供的值),因此我的变量汽车的列表项也被修改了,因为它的值指向我更改的对象。这意味着当我返回汽车列表屏幕时,我已经丢失了第一辆注册汽车的价值,并显示列出的两辆汽车,其中包含相同的信息,即我上次注册的信息

print(cars); // [Car(1, 'Ford', '2,50')]

car.id = null;
car.brand = 'Chevrolet';
car.model = '1,45';

print(cars);  // [Car('Chevrolet', '1,45'), Car('Chevrolet', '1,45')]

我读过一些文章,说 Dart 中只有传递值,但他们也说这个值是对存储在内存中的对象的引用(在像 Dart 这样的现代语言中,传递引用的真正含义是什么?),这给了我一个问题。

我想保留这种使用全局范围列表的方法,这样每当我返回到列出汽车的屏幕时,我就不需要查询本地数据库来获取此信息,我已经拥有了信息,如果可能的话,我希望汽车实例也保持全局范围,这样我就不必在每个窗体的构造函数中传递它

我已经尝试过但没有用:

我已经尝试将 Car 对象传递给 Map,并尝试创建一个返回私有范围汽车列表并将其分配给全局列表的方法

如何解决此问题,而不必通过将汽车作为专用范围来更改所有表单?

Flutter dart 按引用传递

评论


答:

1赞 jamesdlin 5/12/2023 #1

另一个创建 Car 的实例

不,变量是对对象的引用;它本身不会创建实例。调用构造函数将创建实例,并且全局变量存储对该实例的引用。Car

如果你想要一个创建实例的东西,那么你最终需要为每个实例调用一个构造函数。如果你想使用一个现有的实例作为一个新实例的模板,Dart 中的一个常见模式是提供一个适当调用构造函数的方法:copyWith

class Car {
  String brand;
  String model;

  Car(this.brand, this.model);

  Car copyWith({String? brand, String? model}) {
    return Car(
      brand ?? this.brand,
      model ?? this.model,
    );
  }
}

请注意,如果您的类具有可为 null 的属性,则需要调整上述方法