Индикатор обновления Flutter перестраивает представление списка.Конструктор после добавления новых элементов с помощью StreamBuilder

#flutter

Вопрос:

У меня есть индикатор обновления, содержащийся в построителе потоков. Каждый раз, когда в Streambuilder добавляются новые данные, индикатор обновления перестраивает свое представление списка.Строитель, прыгающий на вершину в процессе.

StreamBuilder( поток: apiResultStream.поток, конструктор: (контекст BuildContext, моментальный снимок AsyncSnapshot) { если(снимок.ошибка){ печать(«имеет ошибку»); } если(!снимок.hasData) {

             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:

Решение состоит в том, чтобы добавить глобальный ключ в индикатор обновления. Это предотвращает перестройку указателя обновления его дочернего элемента, когда у StreamBuilder появляются новые данные.

 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(),


                ))

);