Есть ли способ установить childCount на слигрид, заполняемый из API?
У меня есть ниже SliverGrid, который заполняется из API. Я не знаю количество элементов, пока не сделаю вызов API. Текущая реализация, представленная ниже, отображает текст "Больше", когда я прокручиваю последние элементы, потому что я не установил childCount. Есть ли способ для меня, чтобы установить childCount. Я бы хотел, чтобы он прекратил прокручивать и рендерить что-нибудь.
Я попытался создать переменную для хранения переменной childCount и переустановить ее в блоке snapshot.hasData, однако новое значение, похоже, игнорируется.
return SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
delegate: SliverChildBuilderDelegate(
(BuildContext context,int index)
{
return StreamBuilder(
stream: bloc.attributesStream ,
builder: (context, snapshot)
{
if(snapshot.hasData)
{
return HomeIconCell(snapshot.data[index]);
//want to set childCount to snapshot.data.length
}
return Text("No more");
},
);
},
childCount: gridChildCount
));
}
2 ответа
Если это StatefulWidget
вы можете использовать setState
обновить счетчик сетки.
...
builder: (context, snapshot)
{
if(snapshot.hasData)
{
return HomeIconCell(snapshot.data[index]);
//want to set childCount to snapshot.data.length
setState((){ gridChildCount = snapshot.data.length; });
}
...
Я решил проблему, обернув SliverGrid внутри StreamBuilder.
Widget build(BuildContext context)
{
final bloc = AttributesProvider.of(context);
bloc.getAttributeList();
// APIServiceProvider api = APIServiceProvider();
//Future<List<AttributeModel>> attributesListFuture = api.getAttributes();
return StreamBuilder(
stream: bloc.attributesStream,
builder: (context, AsyncSnapshot<List<AttributeModel>>snapshot) =>SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
delegate: SliverChildBuilderDelegate(
(context, index) => HomeIconCell(snapshot.data[index]),
childCount: snapshot.hasData ? snapshot.data.length : 0,
)
)
);
}