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

xzabzqsa  于 2023-05-19  发布在  Flutter
关注(0)|答案(1)|浏览(133)

我有两个全局作用域变量,一个存储汽车列表,另一个创建Car示例

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

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

car.fuelPrice = '2,50';

[...]

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

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

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中只有通过值传递,但是他们也说这个值是对存储在内存中的对象(What is the true meaning of pass-by-reference in modern languages like Dart?)的引用,这给了我一个问题。
我想保留这种使用全局作用域列表的方法,这样每当我返回到列出汽车的屏幕时,我不需要查询本地数据库来获取此信息,我已经拥有了这些信息,如果可能的话,我希望汽车示例也保持全局作用域,这样我就不必在每个表单的构造函数中传递它

我已经尝试过了,但没有成功:

我已经尝试过将Car对象传递给Map,并尝试创建一个返回私有范围汽车列表的方法,并将其分配给全局列表
我怎样才能解决这个问题,而不必通过将car作为私有作用域来更改所有表单?

jslywgbw

jslywgbw1#

另一个创建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,
    );
  }
}

注意the above approach needs to be adjusted if your class has nullable properties

相关问题