首页 > 解决方案 > 如何追踪为什么 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

我在调试器中看到了这种情况。

标签: dartflutterscoped-model

解决方案


解决了。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 构造函数。


推荐阅读