file_state_manager 1.2.0 copy "file_state_manager: ^1.2.0" to clipboard
file_state_manager: ^1.2.0 copied to clipboard

This package allows you to easily undo and redo saved data in your applications.

example/file_state_manager_example.dart

import 'package:file_state_manager/file_state_manager.dart';

class ExampleClass extends CloneableFile {
  late int count;
  late ExampleClassChild child;

  ExampleClass(this.count, this.child);

  ExampleClass.fromDict(Map<String, dynamic> src) {
    count = src["count"];
    child = ExampleClassChild.fromDict(src["child"]);
  }

  @override
  ExampleClass clone() {
    return ExampleClass.fromDict(toDict());
  }

  @override
  Map<String, dynamic> toDict() {
    return {"count": count, "child": child.toDict()};
  }

  // Required if you want to set enableDiffCheck param to true.
  @override
  bool operator ==(Object other) {
    if (other is ExampleClass) {
      return count == other.count && child == other.child;
    } else {
      return false;
    }
  }

  // Required if you want to set enableDiffCheck param to true.
  @override
  int get hashCode {
    return Object.hashAll([count, child]);
  }
}

class ExampleClassChild extends CloneableFile {
  late String message;

  ExampleClassChild(this.message);

  ExampleClassChild.fromDict(Map<String, dynamic> src) {
    message = src["message"];
  }

  @override
  ExampleClass clone() {
    return ExampleClass.fromDict(toDict());
  }

  @override
  Map<String, dynamic> toDict() {
    return {"message": message};
  }

  // Required if you want to set enableDiffCheck param to true.
  @override
  bool operator ==(Object other) {
    if (other is ExampleClassChild) {
      return message == other.message;
    } else {
      return false;
    }
  }

  // Required if you want to set enableDiffCheck param to true.
  @override
  int get hashCode {
    return Object.hashAll([message]);
  }
}

void main() {
  // Undo, Redo.
  final saveFile = ExampleClass(0, ExampleClassChild("First State"));
  // Also enableDiffCheck param to true.
  final fsm = FileStateManager(saveFile, stackSize: 30, enableDiffCheck: true);
  saveFile.child.message = "Second State";
  fsm.push(saveFile);
  if (fsm.canUndo()) {
    // First State
    print((fsm.undo()! as ExampleClass).child.message);
  }
  if (fsm.canRedo()) {
    // Second State
    print((fsm.redo()! as ExampleClass).child.message);
  }

  // Save and restore the entire history.
  // Convert to map
  List<Map<String, dynamic>> history = [];
  for (CloneableFile i in fsm.getStack()) {
    history.add((i as ExampleClass).toDict());
  }
  // Restore from map
  List<ExampleClass> restoredHistory = [];
  for (Map<String, dynamic> i in history) {
    restoredHistory.add(ExampleClass.fromDict(i));
  }
  final restoredFSM = FileStateManager(restoredHistory.removeAt(0),
      stackSize: 30, enableDiffCheck: true);
  for (ExampleClass i in restoredHistory) {
    restoredFSM.push(i);
  }

  // Check file
  ExampleClass restoredNowState = restoredFSM.now() as ExampleClass;
  // Second State
  print(restoredNowState.child.message);
  if (restoredFSM.canUndo()) {
    // First State
    print((restoredFSM.undo()! as ExampleClass).child.message);
  }
  // 0
  print(restoredFSM.nowIndex());
  // Push an object with the same parameters (invalid because diff checking is enabled)
  saveFile.child.message = "First State";
  restoredFSM.push(saveFile);
  // 0
  print(restoredFSM.nowIndex());

  // You can also explicitly disable the next push.
  restoredFSM.skipNextPush();
  saveFile.child.message = "Second State";
  // Invalid push
  restoredFSM.push(saveFile);
  // 0
  print(restoredFSM.nowIndex());
  // Valid push
  restoredFSM.push(saveFile);
  // 1
  print(restoredFSM.nowIndex());
}
3
likes
160
pub points
47%
popularity

Publisher

unverified uploader

This package allows you to easily undo and redo saved data in your applications.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

flutter

More

Packages that depend on file_state_manager