#dart #flutter
#дротик
Вопрос:
есть ли какой-либо рабочий пример сетки SliverGrid, заполненной выборкой? Все найденные мной примеры относятся к статическому / типизированному контенту.
Я хочу заполнить SliverGrid динамическим контентом, извлеченным из API.
Редактировать
Это текущая структура, которая у меня есть, SliverToBoxAdapter заполняется ListView, который прокручивается по горизонтали, а ниже приведена сетка SliverGrid, которую я скопировал, и, например, генерирует бесконечную прокрутку с двумя столбцами.
Я попытался добавить другой SliverToBoxAdapter с вертикальным отображением списка, но затем прокрутка перестает работать, и требуется определить высоту.
Я хочу знать, могу ли я заполнить SliverGrid таким же образом, как ListView, и как это сделать, поскольку я не могу найти ни одного примера.
Я не хочу выглядеть ленивым, но я новичок в Flutter и не знаю, как этого добиться.
return Scaffold(
body: CustomScrollView(
slivers: [
SliverAppBar(
//SOME OPTIONS AND VALUES HERE
),
SliverToBoxAdapter(
// this is populated with a fetch
//child: NiceWidgetHere(),
),
SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 1.5,
),
delegate: SliverChildBuilderDelegate(
// Don't know what to do here
//(context, index) => AnotherNiceWidgetHere(),
),
)
],
)
);
На изображении ниже вы можете увидеть макет, который у меня есть. Как горизонтальный ListView, так и вертикальный GridView должны извлекать содержимое из json API, выборка не является проблемой, поскольку уже работает в горизонтальном ListView.
Комментарии:
1. превратите возврат вашего HTTP-вызова в виджет. Для достижения этого вы можете использовать FutureBuilder.
2. Привет @RubensMelo спасибо за ваш ответ, я погуглил FutureBuilder и не нашел ничего близкого к тому, что мне нужно. Также в документации нет более подробной информации docs.flutter.io/flutter/widgets/FutureBuilder-class.html
3. FutureBuilder — это что-то вроде: «создайте любой виджет с вашим ответом json». В вашем случае дочерним
NiceWidgetHere()
иAnotherNiceWidgetHere()
должно быть FutureBuilder(), параметром future в FutureBuilder должен быть возврат вашего http-вызова, а builder должен возвращать любой виджет, который вы хотите.
Ответ №1:
Вы должны использовать FutureBuilder, как заявили другие. Я сделал это, обернув все в SliverChildBuilderDelegate в FutureBuilder. Вот моя рабочая копия.
Widget build(BuildContext context) {
APIServiceProvider api = APIServiceProvider();
Future<List<AttributeModel>> attributesListFuture = api.getAttributes();
return SliverGrid(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
delegate: SliverChildBuilderDelegate(
(BuildContext context,int index)
{
return FutureBuilder(
future: attributesListFuture ,
builder: (context, snapshot)
{
return snapshot.connectionState == ConnectionState.done? snapshot.hasData
? HomeIconCell(snapshot.data[index])
: Text('Retry')
: Text('progress');
},
);
},
));
}