Skip to content
This repository was archived by the owner on Jan 16, 2026. It is now read-only.

Repository files navigation

undo

Buy Me A CoffeeDonategithub pagestestsGitHub starsundo

An undo redo library for Dart/Flutter. Forked from here and updated for Flutter. Demo can be viewed here.

Warning

This project has moved here: https://github.com/rodydavis/packages.dart

Usage

Create an ChangeStack to store changes

import'package:undo/undo.dart';
var changes =ChangeStack();

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

var count =0;
changes.add(
Change(count, () => count++, (val) => count = val);
name:"Increase"
);

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

var person =newPerson()
..firstName ="John"
..lastName ="Doe";
changes.add(
Change(
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

Simple Stack Example

classHomeScreenextendsStatefulWidget {
@override_HomeScreenStatecreateState() =>_HomeScreenState();
}
class_HomeScreenStateextendsState<HomeScreen> {
SimpleStack _controller;
@overridevoidinitState() {
_controller =SimpleStack<int>(
0,
onUpdate: (val) {
if (mounted)
setState(() {
print('New Value -> $val');
});
},
);
super.initState();
}
@overrideWidgetbuild(BuildContext context) {
final count = _controller.state;
returnScaffold(
appBar:AppBar(
title:Text('Undo/Redo Example'),
),
body:Center(
child:Text('Count: $count'),
),
bottomNavigationBar:BottomAppBar(
child:Row(
children:<Widget>[
IconButton(
icon:Icon(Icons.arrow_back),
onPressed:!_controller.canUndo
?null: () {
if (mounted)
setState(() {
_controller.undo();
});
},
),
IconButton(
icon:Icon(Icons.arrow_forward),
onPressed:!_controller.canRedo
?null: () {
if (mounted)
setState(() {
_controller.redo();
});
},
),
],
),
),
floatingActionButtonLocation:FloatingActionButtonLocation.endDocked,
floatingActionButton:FloatingActionButton(
heroTag:ValueKey('add_button'),
child:Icon(Icons.add),
onPressed: () {
_controller.modify(count +1);
},
),
);
}
}

About

Undo/Redo for Flutter and Dart

Resources

Stars

63 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages