当前位置: 首页 > 知识库问答 >
问题:

Flutter刷新指示器重建Listview。使用StreamBuilder添加新项目后的Builder

和和裕
2023-03-14

我有一个包含在StreamBuilder中的刷新指标。每当StreamBuilder添加了新数据时,刷新指标都会重建其Listview。建筑商在这个过程中跳到了顶端。

StreamBuilder(stream: apiResultStream.stream,Builder:(BuildContext上下文,AsyncSnapshot快照){if(snapshot.has错误){print(有错误);}if(!snapshot.has数据){

            return  RefreshIndicator(
                onRefresh: () {
                  _apiResult=[];
                  return _loadMoreData(0);
                },
                child:snapshot.data.length == 0 ? Padding(
                  padding: const EdgeInsets.all(20.0),
                  child: Center(child: Text('No items', style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.bold),)),
                ):SingleChildScrollView(
                    controller: scrollController,
                    physics: const AlwaysScrollableScrollPhysics(),
                    child:ListView.builder(
                    itemBuilder:(BuildContext ctxt, int index){
                      return InkWell(
                          
                          child:TripItem(key: ValueKey(snapshot.data[index].Id),item:snapshot.data[index])
                      );
                    }
                    ,itemCount:snapshot.data.length,
                    shrinkWrap: true,
                      physics: NeverScrollableScrollPhysics(),
                    key: UniqueKey(),


                ))

            );
     

共有1个答案

夹谷岳
2023-03-14

解决方案是将GlobalKey添加到刷新指标。当StreamBuilder有新数据时,这将阻止ReresIndex重建其子级。

StreamBuilder(
    stream: apiResultStream.stream,
    builder:
        (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
          if(snapshot.hasError){
            print("has error");
          }
          if(!snapshot.hasData)
          {


       
            return  RefreshIndicator(
                key: _refreshIndicatorKey ,
                onRefresh: () {
                  _apiResult=[];
                  return _loadMoreData(0);
                },
                child:snapshot.data.length == 0 ? Padding(
                  padding: const EdgeInsets.all(20.0),
                  child: Center(child: Text('No items', style: 
                  TextStyle(fontSize: 16.0, fontWeight: 
                  FontWeight.bold),)),
                ):SingleChildScrollView(
                    controller: scrollController,
                    physics: const AlwaysScrollableScrollPhysics(),
                    child:ListView.builder(
                    itemBuilder:(BuildContext ctxt, int index){
                      return InkWell(
                          
                          child:TripItem(key: 
            ValueKey(snapshot.data[index].Id),item:snapshot.data[index])
                      );
                    }
                    ,itemCount:snapshot.data.length,
                    shrinkWrap: true,
                      physics: NeverScrollableScrollPhysics(),
                    key: UniqueKey(),


                ))

);

     
 类似资料:
  • 现在我在streambuilder中使用bloc模式,当我刷新父窗口小部件时,我可以看到请求此行两次。(我的意思是构建方法被请求两次)我怎么能只生成一个?我看到了,他们说使用instance或initstate,但对于bloc模式,我认为使用initstate是不可能的,const value不适用于

  • 问题内容: 我正在做一个项目。它只是显示任务列表并向其中添加新任务。我有3个班级。一种用于添加,一种用于查看,一种用于保存所有信息(或者我认为)。 我的列表中已经有2个任务,它们显示正确。 问题是,当我 添加 新任务时,它不会在视图中显示。我尝试了许多可能的解决方案: 只需将项目添加到列表 创建一个新列表,其中包含旧列表中的项目并重建适配器; 使用沿着与附加()命令; 等等 这是我的代码,有点混乱

  • 问题内容: 我想在运行时按下按钮时向JFrame中添加一些新组件。到目前为止,该方法仍然有效,但是我必须手动调整窗口大小才能看到新组件。 有什么我可以触发的动作或可以调用的方法来刷新窗口吗?任何帮助表示赞赏。提前致谢。 问题答案: 你必须去框架。如果这样不起作用,您还必须致电

  • 添加firestore依赖项后构建失败,错误如下:这只发生在添加firestore依赖项后,当我删除它时,应用程序构建得很好。 失败:生成失败,出现异常。 梯度包装属性: 和我的颤振依赖:

  • 我是Flutter的新手,面临着StreamBuilder的问题 我在点击卡片列表中可用的按钮(应用按钮)时进行网络呼叫,基于显示的其他按钮。 我面临的问题是,小部件不更新成功的网络调用后,但当我刷新页面我得到更新的结果。 我做错了什么? 我没有在这方面使用任何状态。我需要用它吗? //下面是我如何将数据添加到流中的 预期结果:当我进行网络呼叫时,如果成功,那么根据网络结果,其他按钮必须显示在相应

  • 我已经尝试了这些链接,但是,我的问题没有解决。 可以阻止Eclipse创建其他appcompat_v7项目吗?附加-appcompat-v7-项目/22726069#22726069 可以阻止Eclipse创建额外的appcompat_v7项目吗?