浏览代码

feat: add cache to text_delta

Vincent Chan 2 年之前
父节点
当前提交
eb519f4e11
共有 1 个文件被更改,包括 8 次插入3 次删除
  1. 8 3
      frontend/app_flowy/packages/flowy_editor/lib/src/document/text_delta.dart

+ 8 - 3
frontend/app_flowy/packages/flowy_editor/lib/src/document/text_delta.dart

@@ -259,6 +259,7 @@ TextOperation? _textOperationFromJson(Map<String, dynamic> json) {
 // basically copy from: https://github.com/quilljs/delta
 class Delta extends Iterable<TextOperation> {
   final List<TextOperation> _operations;
+  String? _rawString;
 
   factory Delta.fromJson(List<dynamic> list) {
     final operations = <TextOperation>[];
@@ -284,6 +285,7 @@ class Delta extends Iterable<TextOperation> {
     if (textOp.isEmpty) {
       return this;
     }
+    _rawString = null;
 
     if (_operations.isNotEmpty) {
       final lastOp = _operations.last;
@@ -431,6 +433,7 @@ class Delta extends Iterable<TextOperation> {
     if (_operations.isEmpty) {
       return this;
     }
+    _rawString = null;
     final lastOp = _operations.last;
     if (lastOp is TextRetain && (lastOp.attributes?.length ?? 0) == 0) {
       _operations.removeLast();
@@ -481,9 +484,11 @@ class Delta extends Iterable<TextOperation> {
     return _operations.map((e) => e.toJson()).toList();
   }
 
-  // TODO: It's unneccesry to compute everytime.
-  String toRawString() =>
-      _operations.whereType<TextInsert>().map((op) => op.content).join();
+  String toRawString() {
+    _rawString ??=
+        _operations.whereType<TextInsert>().map((op) => op.content).join();
+    return _rawString!;
+  }
 
   @override
   Iterator<TextOperation> get iterator => _operations.iterator;