Flutter flatter,更新一组内部有状态小部件列表的状态

Flutter flatter,更新一组内部有状态小部件列表的状态,flutter,statefulwidget,Flutter,Statefulwidget,我正在构建一个网格系统,并且很难更新一行中每个小部件的状态。它们的大小需要动态变化。在某些情况下会调用didUpdateWidget(),但并不总是更新每个小部件的状态 基本上,我如何循环一个Bloc函数中的statefulwidget列表,并让每个Widget更新它们的状态,从而改变宽度 我找到的所有指南都关注于有状态小部件内部更新,而不是外部更新 class ResponsiveGridItem extends StatefulWidget { double itemWidth;

我正在构建一个网格系统,并且很难更新一行中每个小部件的状态。它们的大小需要动态变化。在某些情况下会调用didUpdateWidget(),但并不总是更新每个小部件的状态

基本上,我如何循环一个Bloc函数中的statefulwidget列表,并让每个Widget更新它们的状态,从而改变宽度

我找到的所有指南都关注于有状态小部件内部更新,而不是外部更新

class ResponsiveGridItem extends StatefulWidget {

   double itemWidth;
   double height;
   Color color;
   String content;
   int row;
   int column;
   bool empty;

 ResponsiveGridItem(
      
        this.itemWidth ,
        this.height ,
        this.color,
        this.content,
        this.row,
        this.column,
        this.empty,);


  @override
  ResponsiveGridItemState createState() => ResponsiveGridItemState();
 } 

class ResponsiveGridItemState extends State<ResponsiveGridItem> {
  double itemWidth = 37;
  double height = 100;
  Color color = Colors.blue;
  String content = "";
  int row;
  int column;
  bool empty = true;

  @override
  initState() {
    super.initState();
     itemWidth = widget.itemWidth;
    // print("init itemWdith is " + itemWidth.toString());
     height = widget.height;
     color = widget.color;
     content = widget.content;
     row = widget.row;
     column = widget.column;
     empty = widget.empty;
  }


  @override
  void didUpdateWidget(ResponsiveGridItem oldWidget) {
  
      itemWidth = widget.itemWidth;
      color = widget.color;
      row = widget.row;
      column = widget.column;
      content = widget.content;
      empty = widget.empty;
     
    super.didUpdateWidget(oldWidget);
  }

 
  @override
  Widget build(BuildContext context) {

   
    return Container(
      height: 100,
      width: itemWidth,
      alignment: Alignment(0, 0),
      color: color,
      child: DragTargetWidget(
        row,
        column,
        empty,
        cardItem: CardItem(content: content, width: itemWidth),
      ),
    );
  }
}
class ResponsiveGridItem扩展StatefulWidget{
双项目宽度;
双高;
颜色;
字符串内容;
int行;
int列;
布尔空;
ResponsiveGridItem(
这个.itemWidth,
这个,身高,
这个颜色,
这个.内容,,
这一排,
本栏,
这个。空,);
@凌驾
ResponsiveGridItemState createState()=>ResponsiveGridItemState();
} 
类ResponsiveGridItemState扩展了状态{
双项宽度=37;
双倍高度=100;
颜色=颜色。蓝色;
字符串内容=”;
int行;
int列;
bool empty=true;
@凌驾
initState(){
super.initState();
itemWidth=widget.itemWidth;
//打印(“init itemWdith是”+itemWidth.toString());
高度=widget.height;
color=widget.color;
content=widget.content;
row=widget.row;
column=widget.column;
empty=widget.empty;
}
@凌驾
void didUpdateWidget(ResponsiveGridItem oldWidget){
itemWidth=widget.itemWidth;
color=widget.color;
row=widget.row;
column=widget.column;
content=widget.content;
empty=widget.empty;
super.didUpdateWidget(oldWidget);
}
@凌驾
小部件构建(构建上下文){
返回容器(
身高:100,
宽度:itemWidth,
对齐:对齐(0,0),
颜色:颜色,
孩子:DragTargetWidget(
一行
专栏,
空的,,
cardItem:cardItem(内容:内容,宽度:itemWidth),
),
);
}
}
只是补充一下,这将是我正在使用的for循环。。对于这个问题,我已经从我的小部件中删除了所有试图编写updateItemWidth的尝试

 for (int i = 0; i < gridData[row].length; i++) {
     
    gridData[row][i].updateItemWidth(newGridItemsSize);

}
for(int i=0;i
所以我最终找到了一个解决方案

var gridItem =  gridData[row][i];
gridData[row].removeAt(i);
          
gridData[row].insert(i, new ResponsiveGridItemSolid(
              gridItem.itemWidth, gridItem.height, gridItem.color, gridItem.content,  row, i, gridItem.empty));
由于没有合适的方法来强制刷新,所以可以通过完全删除小部件并重新创建它来调用build方法。我也切换到了无状态小部件