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
就不会执行多次了。
在我的父小部件中,我有 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
就不会执行多次了。