setState 重建父部件,导致 FutureBuilders 中出现闪烁效果(因为它们重建了?)

setState rebuilds the parent widget, causing a blink effect in FutureBuilders (because they rebuild?)

在我的父小部件中,我有 2 个 FutureBuilder

Image FutureBuilder

FutureBuilder(
              future: scannedUserBloc.getImageUrl(widget.userId),
              builder: (context, snapshot) {
                if(snapshot.connectionState == ConnectionState.done) {
                  return Container(
                      height: MediaQuery.of(context).size.height / 5,
                      width: MediaQuery.of(context).size.width / 5,
                      child: Image.network(snapshot.data)
                  );
                } else {
                  return Text("Image is loading");
                }
              }

列出未来的建造者

FutureBuilder(
    future: scannedUserBloc.getMembershipPrograms(widget.userId),
    builder: (context, snapshot) {
      if(snapshot.connectionState == ConnectionState.done) {
        var programs = snapshot.data as List<MembershipPrograms>;
        if(programs.length > 0) {
          hasPrograms = true;
          return programsRowWidget(context, programs);
        } else {
          return noProgramsColumnWidget(context);
        }
      }else {
        //loading indicator
        return Container(

        );
      }
});

当我想点击 ListView 中的一个项目时,我希望它改变它的边框,所以它看起来像是被选中了。为此,我需要调用 setState,但当我调用它时,它会导致 FutureBuilders 闪烁。发生这种情况是因为(我假设)小部件重建,这导致 FutureBuilders 对后端进行异步调用,使项目暂时消失,直到再次获取项目。

是否有任何解决方法或修复方法?我采用的方法总体上是不是很糟糕?

您可以将 ListView 小部件分隔到不同的 Stateful class。然后从那里调用 setState。那么FutureBuilder就不会执行多次了。