修改对象的副本是同时修改原始对象

时间:2019-12-24 14:50:23

标签: flutter dart

在更改对象副本的DateTime属性时,它也在更新原始对象。在下面的代码中,当按下按钮时,我希望仅更新_reminder.dueDate,但是同时更新_reminder.dueDatewidget.reminder.dueDate

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

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

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

1 个答案:

答案 0 :(得分:0)

由于我知道_reminder = widget.reminder仍引用相同的对象,因此通过制作对象的实际副本来解决。

在提醒对象中,我创建了一个复制功能,该功能返回了一个与原始属性相同的新提醒。

提醒对象:

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

小部件:

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

    super.initState();
  }