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
Flutter 试图从小部件访问状态,可能使用了错误的设计_Flutter_Widget_State - Fatal编程技术网

Flutter 试图从小部件访问状态,可能使用了错误的设计

Flutter 试图从小部件访问状态,可能使用了错误的设计,flutter,widget,state,Flutter,Widget,State,我正在学习Flitter并尝试制作一种可变图像小部件。我们的想法是制作一个可变映像StatefulWidget,在提供新映像时重建它。我尽量避免在每次更改图像时重建整个窗口小部件树,因为这似乎有些过分,我计划每秒更新几次图像。所以我只想重建那个可变图像小部件 下面是我的代码,其中有一些注释来解释我的困境: class MutableImage extends StatefulWidget { @override State<StatefulWidget> createStat

我正在学习Flitter并尝试制作一种可变图像小部件。我们的想法是制作一个可变映像StatefulWidget,在提供新映像时重建它。我尽量避免在每次更改图像时重建整个窗口小部件树,因为这似乎有些过分,我计划每秒更新几次图像。所以我只想重建那个可变图像小部件

下面是我的代码,其中有一些注释来解释我的困境:

class MutableImage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MutableImageState();
  }

  void updateImage(List<int> bytes) {
    // !!!!!! Would like to call this method here, but state is not available from Widget, which means I want to do something wrong, but not sure exactly how I should do it...
    // this.state.updateImage(bytes);
  }
}
class MutableImageState extends State<MutableImage> {
  List<int> _bytes;
  void updateImage(List<int> bytes) {
    setState(() {
      _bytes=bytes;
    });
  }

  @override
  Widget build(BuildContext context) {
    if ((_bytes==null)||(_bytes.length==0)) {
      return Center(child: CircularProgressIndicator());
    }
    return Image.memory(_bytes);
  }
}
类MutableImage扩展StatefulWidget{
@凌驾
状态createState(){
返回MutableImageState();
}
void updateImage(列表字节){
//!!!!!!!!!想在这里调用此方法,但小部件中的状态不可用,这意味着我想做错事,但不确定该如何做。。。
//this.state.updateImage(字节);
}
}
类MutableImageState扩展了状态{
列表_字节;
void updateImage(列表字节){
设置状态(){
_字节=字节;
});
}
@凌驾
小部件构建(构建上下文){
如果(_字节==null)| |(_字节.长度==0)){
返回中心(子项:CircularProgressIndicator());
}
返回Image.memory(_字节);
}
}
然后,我们的想法是在另一个有状态的小部件中使用这个小部件

MutableImage _mutableImage;
@override
Widget build(BuildContext context) {
  if (_mutableImage == null) _mutableImage=MutableImage();
  return : Row( //using Row as an example, the idea is that the mutable Image is deep into a tree of widgets, and I want to rebuild only _mutableImage when image changes, not all widgets.
    children : <Widget>[
      child0, child1, _mutableImage, child3, child4
    ]
  );
}

void updateImage(List<int> bytes) {
  _mutableImage?.updateImage(bytes);
}
MutableImage\u MutableImage;
@凌驾
小部件构建(构建上下文){
如果(_mutableImage==null)_mutableImage=mutableImage();
return:Row(//以Row为例,其思想是可变图像深入到小部件树中,我只想在图像更改时重建_mutableImage,而不是所有小部件。
儿童:[
child0,child1,_可变图像,child3,child4
]
);
}
void updateImage(列表字节){
_可变图像?.updateImage(字节);
}

那么,有没有一个好方法可以做到这一点?我很困惑,谢谢你的帮助/提示。

这是一个应用
GlobalKey
的地方。在
MutableImage
的父窗口小部件中,生成一个全局键并将其传递给
MutableImage
。使用该键,您可以使用键上的
.currentState
并调用
updateImage
来访问
MutableImage
状态

您必须添加key作为
MutableImage
构造函数的参数,并调用
super(key:key)
<代码>更新图像也应移动到
可变图像
的状态

关键:

访问国家:

_imageKey.currentState.updateImage();

哦,好的,thx,这看起来确实是一个很好的解决方案。让我测试一下,我会接受答案的。GlobalKey变量似乎应该使用MutableImageState,而不是MutableImage(编辑了您的答案)。@jptsetung很抱歉,它应该是状态。
MutableImage(key: _imageKey);
_imageKey.currentState.updateImage();