关于

一个字符串生成器,可帮助实现有序序列的实时编辑。

它使重排、排序、交错事务更快、更简单。

用法

  • 在字典序(词典序或字母序)中获取两个字符串之间的字符串。

    final mid = between(prev: 'B', next: 'D');
    assert(
      areEqual(
        [mid, 'D', 'B']..sort(),
        ['B', mid, 'D'],
      ),
    );
  • 生成顺序键.

    final keyCount = 100; 
    final orderKeys = generateOrderKeys(keyCount);

    这在以下情况很有用

    1. 表(集合)为空时,无法使用between

      Future<void> addTodo(CreateTodo command) async {
        final String orderKey = todos.isEmpty 
          ? generateOrderKeys(1).first // <==
          : between(prev: todos.last.orderKey);
        
        final todo = await todoRepository.create(command, orderKey);
        todos.add(todo);
      }
    2. 迁移到高效的有序系统时。

      Future<void> migrateToLexicalOrderSystem(Table table) async {
        final itemCount = table.count();
        final orderKeys = generateOrderKeys(itemCount);
        /* omitted */
      }

注意

between函数仅接受允许的字符作为参数

更具体地说,between内部使用了以下代码。

LexOrderValidator().checkBetweenArgs(prev: prev, next: next);

LexOrderValidator检查以下约束

  1. prevnext都必须由字母组成。

  2. prev.isNotEmpty && next.isNotEmpty

  3. prev != null && next != null

  4. next != 'A'

  5. prev != next

  6. prev[prev.length-1] != 'A' && next[next.length-1] != 'A'

  7. prev.compareTo(next) == -1,例如

    between(prev: 'C', next: 'B');

在调试模式下,如果违反上述约束,您会收到错误。但在发布模式下不会。您可以使用LexOrderValidator手动检查约束。

我建议您仅使用betweengenerateOrderKey来生成键。因为该软件包仅为此场景而设计。如果您为between函数使用来自其他来源的参数,您的数据的有序状态可能会被破坏。

GitHub

查看 Github