我最近为了我的一个个人项目而学习 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();
});
强烈怀疑这是由于您的
Node
模型缺乏不变性造成的。请注意字段 Node? parentNode;
。看看使用 final
是否可以解决 parentNode
字段的问题。