通过堆栈列表重建Flutter小部件

nukf8bse  于 2023-02-25  发布在  Flutter
关注(0)|答案(1)|浏览(186)

这是一个初学者的问题,关于更新一个小部件的属性。但我很难找到一个答案,在论坛上关于以下内容:在一个外部类(b1)中,我将小部件的属性存储在一个列表(tileListe)中,构建方法如下所示:

@override
  Widget build(BuildContext context) {

    return Scaffold(
      body: Stack(
        children: b1.tileList,
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            b1.tileList[12].text= 'abc';   // Does not update 
            b1.tileList[12].pos.y = 10.0;  // Does not update 
            b1.tileList.removeAt(0);       // Updates when Button is pushed
          });
        },
        child: const Icon(Icons.remove),
      ),
    );
   }

tileList中的小部件配备了一个ValueKey(〈〉),其中从1开始计数。注意列表的键和索引不会相互干扰。
我想更新第一个(设置文本为abc)和第二个(设置索引为12的小部件的y位置为10)属性,并立即看到更改。但这只有在Andriod Studio的“热重启”之后才会发生。
相比之下,第三个命令(删除索引为0的小部件)会立即更新。第一个和第二个命令到第三个命令在可见更新行为方面有什么不同?如何让所有三个更改都直接可见?

goqiplq2

goqiplq21#

假设tileList包含Widget,通过在build()中调用setState(),您将不会从b1.titleList重建这些小部件。

  • (<your-type-of-titleList>中-创建刷新单个对象可能性
Function?() _setStateTemp;

void refresh() {
    _setStateTemp?();
}

@override
Widget build(BuildContext context) {
    _setStateTemp = setState((){}); //add this line
    [the rest of your code...]
}
  • in b1-迭代整个列表并重建titleLists childreen(flutter在此类操作中非常有效)
void refreshList() {
    for (<your-type-of-titleList> tl in titleList) {
        tl.refresh();
    }
}
  • 在您的build()中-调用创建的refreshList()以应用listTitles子目录中的所有更改
@override
Widget build(BuildContext context) {
 return Scaffold(
   body: Stack(
     children: b1.tileList,
   ),
   floatingActionButton: FloatingActionButton(
     onPressed: () {
       setState(() {
         b1.tileList[12].text= 'abc';   
         b1.tileList[12].pos.y = 10.0;  
         b1.tileList.removeAt(0);     
         b1.refreshList(); //add this line
       });
     },
     child: const Icon(Icons.remove),
   ),
 );
}

希望能有所帮助。我写这个没有IDE,所以我可能会犯一些错误。问是什么不清楚。干杯!

相关问题