Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在dart中将一个变量指向另一个变量的正确方法_Flutter_Dart - Fatal编程技术网

Flutter 在dart中将一个变量指向另一个变量的正确方法

Flutter 在dart中将一个变量指向另一个变量的正确方法,flutter,dart,Flutter,Dart,我希望变量attachedImagesListKey根据具体情况指向不同的变量。我是这样实现的 var attachedImagesListKey = event.toFront ? frontAttachedImagesListKey : backAttachedImagesListKey; 但是当我想用attachedImagesListKey执行一些操作时,例如 attachedImagesListKey.currentState

我希望变量
attachedImagesListKey
根据具体情况指向不同的变量。我是这样实现的

var attachedImagesListKey = event.toFront
          ? frontAttachedImagesListKey
          : backAttachedImagesListKey;
但是当我想用
attachedImagesListKey
执行一些操作时,例如

attachedImagesListKey.currentState
          .insertItem(item);
异常被抛出

NoSuchMethodError: The method 'insertItem' was called on null.
Receiver: null
Tried calling: insertItem(0)

我做错什么了吗?实现这一点的最佳方法是什么?

您的问题可能在于如何(微型)管理密钥。首先,将专用键声明为全局变量(我希望尽可能不鼓励这种做法):

GlobalKey FrontAttacheDimagesList键=
GlobalKey();
GlobalKey BACKATTACHEDIMAGESLASTKEY=
GlobalKey();
然后在widget类中声明您的常规密钥:

class\u AttachedImagesState扩展状态{
...
var动画列表键;
...
}
…然后在
initState
方法中初始化它:

class\u AttachedImagesState扩展状态{
...
@凌驾
void initState(){
...
动画列表键=
widget.isFront?FrontAttacheDimagesList键:BackAttacheDimagesList键;
...
}
...
}
这里我们进入问题的第一部分。您声明了两个键,但在小部件中仅使用其中一个键。另一个变成孤儿

问题的第二部分在您的集团代码中:

class NewImageBloc扩展了Bloc{
...
流\u mapPickImageEventToState(PickImage事件)异步*{
...
var attachedImagesListKey=event.toFront
?前附件尺寸页快捷键
:backAttachedImagesListKey;
...
attachedImagesListKey.currentState.insertItem(imagesPaths.length);
...
}
...
}
还记得其中一把钥匙是怎么变成孤儿的吗?根据
event.toFront
的值,您可能会为以后的进程选择此键。当然,孤立密钥的
当前状态将为null

真正的问题是,您使用密钥的方式很容易出现此类混淆和错误。您不应该将密钥声明为全局变量,而应该在本地声明它们。(另外,除非出于某种原因希望此小部件可以全局访问,否则您不应该使用
GlobalKey
。)然后您可以将它们传递给bloc的构造函数或以其他方式提供它们

或者,如果您确实希望这些小部件可以全局访问,那么为了协调孤立密钥,您必须维护两个相应的小部件。然后根据
isFront
的值隐藏其中一个

也值得注意的是,这取决于你实际上在这里做什么,你应该考虑重构你的代码,以消除对依赖密钥的需要。如果您所要做的只是将小部件的状态翻转为“前”或“后”,那么使用回调或事件总线也可以轻松(更简单)完成


(从这里开始,这是一个体系结构决策,这是一个广泛而固执己见的话题,我不能像你那样理解你的代码或你的应用程序体系结构。从这一点开始,你必须自己决定如何继续。)

看来
attachedImagesListKey的
currentState
为空,这意味着您分配给它的任何键也有一个null
currentState
。这可能是因为您尚未将该键分配给小部件,或者因为您试图在构建链接的小部件之前引用该状态。如果看不到更多的代码或解释您试图执行的操作,就无法确定这里是哪种情况。@Abion47最重要的代码就是这样的。它不会起作用,因为没有结构,但也许它足以看出问题所在。我每次构建小部件时都会打印文本,而且它一直都在打印,因此也应该指定状态。但同样的错误也发生了。我使用全局键来处理AnimatedList,正如这段短片中所示。所以更好的解决方案是直接将animatedList的状态传递给bloc,而不是使用全局键?或者可能有另一种类型的键,我可以用它来处理状态?谢谢你的回复!这真的很有帮助。