Undo/Redo for Flutter and Dart

undo

An undo redo library for Dart/Flutter.

Usage

Create an ChangeStack to store changes

import 'package:undo/undo.dart';

var changes = new ChangeStack();

Add new undo, redo commands using ChangeStack.add(). When a change is added, it calls the change's execute() method. Use Change.inline() for simple inline changes.

var count = 0;

changes.add(
  new Change.inline(() => count++, () => count--);
  name: "Increase"
);

Use Change.property() when changing a field on an object. This will store the field's old value so it can be reverted.

var person = new Person()
    ..firstName = "John"
    ..lastName = "Doe";

changes.add(
  new Change.property(
    person.firstName, 
    () => person.firstName = "Jane",
    (oldValue) = person.firstName = oldValue
  )
)

Undo a change with undo().

print(person.firstName); // Jane
changes.undo();
print(person.firstName); // John

Redo the change with redo().

changes.redo();
print(person.firstName); // Jane

Use group() to wrap many changes in a transaction. Any new changes will be added to the group until commit() is invoked.

count = 0;

changes.group();

var increase = new Change.inline(() => count++, () => count--);
changes.add(increase);
changes.add(increase);

changes.commit();
print(count); // 2

changes.undo();
print(count); // 0

Calling discard() instead of commit() will unapply the group. This is useful for previewing changes.

count = 0;

changes.group();
changes.add(increase);		
changes.add(increase);
changes.discard();

print(count); // 0

Extend Change to create your own changes.

class IncreaseChange extends Change {

  int value;
  
  IncreaseChange(this.value);
  
  void execute() => value++;
  void undo() => value--;

}

GitHub

https://github.com/rodydavis/undo