вы можете использовать щепки, чтобы включить все сетки и списки в одно представление прокрутки.
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget{
@override
State<StatefulWidget> createState() {
return _MyAppState();
}
}
class _MyAppState extends State<MyApp> {
bool isGrid = true;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('demo'),),
body: Padding(
child: CustomScrollView(
slivers: <Widget>[
SliverToBoxAdapter(
child: Container(
height: 100.0,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: 10,
itemBuilder: (context, index) {
return Container(
width: 100.0,
child: Card(
child: Text('data'),
),
);
},
),
),
),
SliverToBoxAdapter(
child: Row(
children: <Widget>[
Text('choose view method'),
Row(
children: <Widget>[
IconButton(icon: Icon(Icons.list), onPressed: (){
setState(() {
isGrid = false;
});
}, ),
IconButton(icon: Icon(Icons.grid_on), onPressed: (){
setState(() {
isGrid = true;
});
}, ),
],
)
],
),
),
ProductsWidget(
isGrid: isGrid,
),
],
), padding: EdgeInsets.all(20),
),
),
);
}
}
class ProductsWidget extends StatelessWidget {
final bool isGrid;
const ProductsWidget({Key key, this.isGrid = true}) : super(key: key);
@override
Widget build(BuildContext context) {
return isGrid ? SliverGrid(
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 200.0,
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 4.0,
),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
width: 100.0,
child: Card(
child: Text('data'),
),
);
},
childCount: 50,
),
) : SliverList(
delegate: SliverChildListDelegate(
[
Card(child: Text('data'),),
Card(child: Text('data'),),
Card(child: Text('data'),),
Card(child: Text('data'),),
],
), ) ;
}
}
