使用 Riverpod (Flutter) 维护树结构很困难

问题描述 投票:0回答:1

我最近为了我的一个个人项目而学习 Flutter。对于该项目,我需要在应用程序中实现一个文件系统,其中每个文件夹充当具有可选子节点的节点。该应用程序还需要跟踪当前打开的文件夹,以便用户可以在不同的目录之间导航。为此,我一直在使用 Riverpod 的 StateNotifier。但由于我不确定的原因,当当前节点更新时,整个树的状态似乎没有得到完全维护。我已经设置了一个 ProviderObserver 来帮助我调试,并且生成的日志似乎表明将子节点添加到根节点没有问题。仅当我将当前通知程序状态更新为子节点时,才会出现此问题。当这种情况发生时,根节点突然丢失了许多子节点,包括我当前正在访问的节点。即使当我返回根节点时,许多子节点似乎都丢失了。代码中是否有我忽略的东西或者还有其他事情发生?我将不胜感激任何形式的帮助或建议。谢谢。

class Node {
  Node? parentNode;
  final String id;
  final String value;
  final List<Node> childNodes;

  Node({
    this.parentNode,
    required this.id,
    required this.value,
    this.childNodes = const [],
  });

  void addNode(Node node) {
    childNodes.add(node);
  }

  List<Node> getAllNodes() {
    return childNodes;
  }

  Node copyWith({
    Node? parentNode,
    String? id,
    String? value,
    List<Node>? childNodes,
  }) {
    return Node(
      parentNode: parentNode ?? this.parentNode,
      id: id ?? this.id,
      value: value ?? this.value,
      childNodes: childNodes ?? this.childNodes,
    );
  }
}
class CurrentNodeNotifier extends StateNotifier<Node> {
  CurrentNodeNotifier()
      : super(
          Node(
            parentNode: null,
            id: uuid.v4(),
            value: 'ROOT',
          ),
        );

  void addNode(String value) {
    final newNode = Node(
      parentNode: state,
      id: uuid.v4(),
      value: value,
    );
    state = state.copyWith(childNodes: [...state.childNodes, newNode]);
  }

  void changeCurrentNode(Node newNode) {
    state = newNode;
  }

  void returnToParent() {
    if (state.parentNode != null) {
      state = state.parentNode!;
    }
  }
}

final currentNodeProvider =
    StateNotifierProvider<CurrentNodeNotifier, Node>((ref) {
  return CurrentNodeNotifier();
});
flutter tree nodes riverpod
1个回答
0
投票

强烈怀疑这是由于您的

Node
模型缺乏不变性造成的。请注意字段
Node? parentNode;
。看看使用
final
是否可以解决
parentNode
字段的问题。

© www.soinside.com 2019 - 2024. All rights reserved.