理解=飞镖运算符

时间:2019-12-18 15:53:30

标签: flutter dart hybrid-mobile-app

=在这里做什么?

List<Segment> totalSegments = flight.departureFlight.segments;

totalSegmentsflight.departureFlight.segments是否都指向相同的内存引用,或者totalSegments的数据与flight.departureFlight.segments相同,但是指向不同的内存位置? > 我的理解是,后者应该发生,因为飞镖是通过价值传递而不是引用。但是,当我在该行下面添加以下行时,发生了一个非常烦人的错误:

totalSegments.addAll(flight.returnFlight.segments);

以上一行实际上修改了flight变量,而变量又以某种方式修改了AsyncSnapshot中的StreamBuilder。虽然,我没有在其他任何地方使用该变量,也没有修改提到的其他变量。
这一切都发生在无状态窗口小部件的build函数内部。也许这与它有关系。
我尝试阅读dart documentation,但是或者找不到我想要的东西,或者只是那里的信息缺失。也请阅读this,但据此,我的用例不应该发生。

3 个答案:

答案 0 :(得分:0)

当涉及到对象时,您正在将对现有对象(内存位置)的引用分配给新变量。在对该引用进行操作时,您更改了相同的对象。

如果这不是您想要的,请查看answers related to (deep) copying of the objects

答案 1 :(得分:0)

List<Segment> totalSegments = flight.departureFlight.segments;

此表达式执行以下操作。

将表达式flight.departureFlight.segments的值分配给变量totalSegments

仅此而已。
无需知道实际发生的情况,因为这是发生的情况。

P.S。
执行表达式flight.departureFlight.segments的结果将获得什么值是另一个问题,因为它取决于表达式flight.departureFlight.segments的操作数成员的实现。

答案 2 :(得分:0)

您误解了Dart通过值而不是通过引用的事实。实际上,恰恰相反:(几乎)所有内容总是通过引用传递的(这通常是一件好事!)因此,由于您编辑了totalSegments,您的departureflight.segments也被编辑了,这是很合逻辑的。它是同义词。解决您的问题的方法之一是:

List<Segment> totalSegments = List();
totalSegments.addAll(flight.departureFlight.segments.toList());