撤销

一个用于 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--;

}

GitHub

https://github.com/rodydavis/undo