-1

When changing a DateTime property of a copy of an object, it is also updating the original object. In the below code, when the button is pressed, I expect only the _reminder.dueDate to be updated, but both _reminder.dueDate and widget.reminder.dueDate are being updated at the same time.

import 'package:flutter/material.dart';
import 'package:realminder/models/reminder.dart';

class Test extends StatefulWidget {
  final Reminder reminder; // <-- Original object

  Test({
    @required this.reminder,
  });

  @override
  _TestState createState() => _TestState();
}

class _TestState extends State<Test> {
  Reminder _reminder;

  @override
  void initState() {
    _reminder = widget.reminder; // <-- Create a copy of object

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      onPressed: () {
        _reminder.dueDate = DateTime.now(); // <-- Both objects being updated here... Why?
      },
    );
  }
}

Before _reminder.dueDate = DateTime.now();: enter image description here

After _reminder.dueDate = DateTime.now();: enter image description here

Ned
  • 430
  • 3
  • 13
  • 1
    [see this on passing by reference](https://stackoverflow.com/questions/25170094/what-is-the-true-meaning-of-pass-by-reference-in-modern-languages-like-dart) – cmd_prompter Dec 24 '19 at 15:05

1 Answers1

0

Resolved by making an actual copy of the object since I learned _reminder = widget.reminder is still referencing the same object.

In my reminder object, I made a copy feature which returned a new reminder with the same properties as the original.

Reminder object:

  Reminder clone() {
    return Reminder(
      dueDate: this.dueDate,
    );
  }

Widget:

  @override
  void initState() {
    _reminder = widget.reminder.clone();

    super.initState();
  }
Ned
  • 430
  • 3
  • 13