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