Flutter:不清楚 ValueChanged 和 FutureBuilder
Posted
技术标签:
【中文标题】Flutter:不清楚 ValueChanged 和 FutureBuilder【英文标题】:Flutter : unclear ValueChanged and FutureBuilder 【发布时间】:2021-10-23 15:08:14 【问题描述】:我正在从我的 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();
);
【问题讨论】:
【参考方案1】:setState
每次都会被调用,因为它会重建您的更新 ui。 Future 无法监听变量的变化。这是一次性响应。相反,如果您希望每次都省略 setState 调用,则需要使用 Stream。
用于删除列表项重复
Future _loadComments() async
listComments = List(); // here add empty list for
listComments = await MyWS()
.getComs(widget.publication.pubId);
【讨论】:
如果 _loadComments 仅在 initState 中调用,为什么我应该在未来清除 listComments ?据我了解,这似乎意味着未来只创建一次(initState),但每次都重建(@build + FutureBuilder)。 当您调用setState
时,它也调用initState
,然后每次调用_loadComments cmets。
我以为initstate
只被屏幕调用了一次以上是关于Flutter:不清楚 ValueChanged 和 FutureBuilder的主要内容,如果未能解决你的问题,请参考以下文章
设置 RadDatePicker 日期而不触发 ValueChanged
selectindexchanged select valuechanged textchanged
何时在 Blazor 中使用 ValueChanged 和 ValueExpression?