Как отследить, почему один участник миксина перезаписывает другого в модели с заданной областью действия? - PullRequest
0 голосов
/ 11 мая 2019

Я пишу свое первое приложение 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 [дата] [0] .duration

Я наблюдал, как это происходит в отладчике.

1 Ответ

0 голосов
/ 13 мая 2019

Решил это.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.

...