dart - 如何追踪为什么 mixin 的一个成员在作用域模型中覆盖另一个成员
问题描述
我正在编写我的第一个 Flutter 应用程序,并使用作用域模型来管理全局状态。我有一个问题,当我更新一个类的一个对象时,它也会更新另一个包含相同类型对象的类列表。我怀疑这是我的误解,但我陷入了思考和旋转。
这是代码
import 'package:flutter/material.dart';
import './wellbeing.dart';
import './activity.dart';
import 'package:scoped_model/scoped_model.dart';
import 'package:date_utils/date_utils.dart';
mixin EventModel on Model {
Map<DateTime, List<Activity>> _events = {};
Activity currentActivity;
Wellbeing currentWellbeing;
String activityType;
DateTime submitDate = DateTime.now();
void updateCurrentActivity(String attribute, int value) {
switch (attribute) {
case 'Intensity':
{
currentActivity.intensity = value;
return;
}
case 'Duration':
{
currentActivity.duration = value;
return;
}
}
}
currentActivity.duration 也会更新 _events[date][0].duration
我在调试器中看到了这种情况。
解决方案
解决了。Dart 使用对添加对象的引用,默认情况下不会使用 .add 构造函数复制它。这是一些解决问题的代码
import 'package:flutter/material.dart';
class MyObject {
int a, b;
MyObject(this.a, this.b);
MyObject.copy(MyObject subject) {
a = subject.a;
b = subject.b;
}
}
void main() {
Map<DateTime, List<MyObject>> _events = {};
DateTime submitDate = DateTime.now();
MyObject myObject;
myObject = MyObject(0, 0);
myObject.a = 1;
myObject.b = 2;
_events[submitDate] = [myObject];
for (int loop = 0; loop < _events[submitDate].length; loop++) {
print(_events[submitDate][loop].a);
print(_events[submitDate][loop].b);
}
print('----------------------------------------------------------');
myObject.a = 3;
myObject.b = 4;
MyObject newObject = new MyObject(6, 7);
_events[submitDate].add(newObject);
for (int loop = 0; loop < _events[submitDate].length; loop++) {
print(_events[submitDate][loop].a);
print(_events[submitDate][loop].b);
}
print('----------------------------------------------------------');
myObject.a = 8;
myObject.b = 9;
newObject = MyObject.copy(myObject);
myObject.a = 10;
myObject.b = 11;
_events[submitDate].add(newObject);
for (int loop = 0; loop < _events[submitDate].length; loop++) {
print(_events[submitDate][loop].a);
print(_events[submitDate][loop].b);
}
}
要么构造一个“新”对象,要么实现一个 .copy 构造函数。
推荐阅读
- python - 多个套接字连接而无需每次都重新打开一个新套接字
- go - 来自go源的这段代码是什么意思?喜欢 (*(*float32)(v.ptr))
- ruby-on-rails - 带有 content_for javascript 头的 simple_form 自定义输入?
- html - 可滚动侧边栏中的 Flexbox 粘性页脚
- android - 单击时更新按钮的不透明度?扑
- android - 如何在 NativeScript 中从 Android 内容 URI 打开文件?
- javascript - 使用 XMLHttpRequest 从函数调用时,函数按预期工作,但使用 EventSource 从函数调用时失败。为什么是这样?
- node.js - Populate() Mongoose 不返回连接数据
- c - 有什么方法可以使用#define 指令来定义 printf 函数?
- excel - 以二进制模式将十六进制字符串写入文件