Flutter:不清楚 ValueChanged 和 FutureBuilder
Flutter : unclear ValueChanged and FutureBuilder
我正在从 API 中获取一些数据。我通过将返回的 JSON 转换为一些小部件 CommentaireSingle.
来处理它们
但是关于 build 方法,我有一些不清楚的地方。
- 每次构建小部件时都会调用 build,包括
setState
方法。
- FutureBuilder 用于在完全加载后生成内容。
- ValueChanged 用于将数据从子级传递到它的父级。
所以我的问题是:为什么每次我执行 setState
时,我的 Future 都会将原始数据添加到我的视图中?我必须清除初始的 listCommentsWidgets 是为了获得“逻辑”结果(不要有两倍于原始小部件列表)
class _CommentairesListingState extends State<CommentairesListing> {
List<Commentaire> listComments = [];
Future loadListComments;
List<Widget> listCommentsWidgets = [];
@override
void initState() {
super.initState();
loadListComments = _loadComments();
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: loadListComments,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return generateComments();
} else {
return Center(
child: SizedBox(
height: 25,
width: 25,
child: CircularProgressIndicator(),
),
);
}
},
);
}
Future _loadComments() async {
listComments = await MyWS()
.getComs(widget.publication.pubId);
}
Expanded generateComments() {
listCommentsWidgets.clear();
for (Commentaire commentaire in listComments) {
CommentaireSingle single = CommentaireSingle(
...
toRemove: updateCommentaireListing, #ValueChanged
responseTo: widget.responseTo);
listCommentsWidgets.add(single);
}
Column column = Column(
children: listCommentsWidgets,
);
return Expanded(
child: Center(
child: Container(
width: MediaQuery.of(context).size.width * 0.90,
child: SingleChildScrollView(
child: column,
),
),
),
);
}
void updateCommentaireListing(Commentaire commentaire) {
setState(() {
listComments.remove(commentaire);
listCommentsWidgets.clear();
});
}
}
setState
每次都会被调用,因为它会重新 ui 更新您的 ui。 Future 不能监听变量的变化。这是一次性的回应。相反,如果您希望每次都忽略 setState 调用,则需要使用 Stream。
用于删除列表项重复
Future _loadComments() async {
listComments = List(); // here add empty list for
listComments = await MyWS()
.getComs(widget.publication.pubId);
}
我正在从 API 中获取一些数据。我通过将返回的 JSON 转换为一些小部件 CommentaireSingle.
来处理它们但是关于 build 方法,我有一些不清楚的地方。
- 每次构建小部件时都会调用 build,包括
setState
方法。 - FutureBuilder 用于在完全加载后生成内容。
- ValueChanged 用于将数据从子级传递到它的父级。
所以我的问题是:为什么每次我执行 setState
时,我的 Future 都会将原始数据添加到我的视图中?我必须清除初始的 listCommentsWidgets 是为了获得“逻辑”结果(不要有两倍于原始小部件列表)
class _CommentairesListingState extends State<CommentairesListing> {
List<Commentaire> listComments = [];
Future loadListComments;
List<Widget> listCommentsWidgets = [];
@override
void initState() {
super.initState();
loadListComments = _loadComments();
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: loadListComments,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return generateComments();
} else {
return Center(
child: SizedBox(
height: 25,
width: 25,
child: CircularProgressIndicator(),
),
);
}
},
);
}
Future _loadComments() async {
listComments = await MyWS()
.getComs(widget.publication.pubId);
}
Expanded generateComments() {
listCommentsWidgets.clear();
for (Commentaire commentaire in listComments) {
CommentaireSingle single = CommentaireSingle(
...
toRemove: updateCommentaireListing, #ValueChanged
responseTo: widget.responseTo);
listCommentsWidgets.add(single);
}
Column column = Column(
children: listCommentsWidgets,
);
return Expanded(
child: Center(
child: Container(
width: MediaQuery.of(context).size.width * 0.90,
child: SingleChildScrollView(
child: column,
),
),
),
);
}
void updateCommentaireListing(Commentaire commentaire) {
setState(() {
listComments.remove(commentaire);
listCommentsWidgets.clear();
});
}
}
setState
每次都会被调用,因为它会重新 ui 更新您的 ui。 Future 不能监听变量的变化。这是一次性的回应。相反,如果您希望每次都忽略 setState 调用,则需要使用 Stream。
用于删除列表项重复
Future _loadComments() async {
listComments = List(); // here add empty list for
listComments = await MyWS()
.getComs(widget.publication.pubId);
}