0

I am writing my first Flutter app, and I use the scoped model to manage global state. I have an issue that when I update one object of a class it also updates another class list containing the same type of objects. I am suspecting its my misconception but I am stuck in my thinking and spinning my wheels.

here is the code

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 also updates _events[date][0].duration

I have watched this happen in the debugger.

1 Answers1

0

Solved it. Dart uses a reference to the added object and does not copy it by default with the .add constructor. Here is some code solving the issue

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);
  }
}

Either construct a "new" object or implement a .copy constructor.