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的主要内容,如果未能解决你的问题,请参考以下文章

Flutter RaisedButton怎样禁用

设置 RadDatePicker 日期而不触发 ValueChanged

selectindexchanged select valuechanged textchanged

何时在 Blazor 中使用 ValueChanged 和 ValueExpression?

GattCharacteristic.ValueChanged 停止被调用

UIPageControl 没有在 valueChanged 上调用选择器