撤销
一个用于 Dart/Flutter 的撤销重做库。
用法
创建一个ChangeStack来存储更改
import 'package:undo/undo.dart';
var changes = new ChangeStack();
使用 ChangeStack.add() 添加新的撤销、重做命令。当添加更改时,它会调用更改的 execute() 方法。对于简单的内联更改,使用 Change.inline()。
var count = 0;
changes.add(
new Change.inline(() => count++, () => count--);
name: "Increase"
);
当更改对象上的字段时,使用 Change.property()。这将存储字段的旧值,以便可以撤销它。
var person = new Person()
..firstName = "John"
..lastName = "Doe";
changes.add(
new Change.property(
person.firstName,
() => person.firstName = "Jane",
(oldValue) = person.firstName = oldValue
)
)
使用 undo() 撤销更改。
print(person.firstName); // Jane
changes.undo();
print(person.firstName); // John
使用 redo() 重做更改。
changes.redo();
print(person.firstName); // Jane
使用 group() 将许多更改包装在一个事务中。直到调用 commit(),任何新的更改都将添加到该组中。
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
调用 discard() 而不是 commit() 将取消应用该组。这对于预览更改很有用。
count = 0;
changes.group();
changes.add(increase);
changes.add(increase);
changes.discard();
print(count); // 0
扩展 Change 以创建您自己的更改。
class IncreaseChange extends Change {
int value;
IncreaseChange(this.value);
void execute() => value++;
void undo() => value--;
}