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