Как я могу использовать сетку внутри столбца?
У меня есть столбец с контейнером, который действует как заголовок, и сетка виджетов ниже. Я хочу, чтобы прокручивалась только сетка, а заголовок не перемещался и всегда отображался.
Это мой код:
class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Column(
children: [
Container(
margin: EdgeInsets.only(left: 24, right: 24),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 22),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Message("Hello, Guest!", size: 32),
Icon(
CustomIcons.statistics,
color: AppColors.blue,
size: 32.0,
),
],
),
SizedBox(height: 14),
Message("What worries you now? Select or Add.", size: 14),
],
),
),
SizedBox(height: 16),
GridView.count(
primary: true,
shrinkWrap: true,
crossAxisCount: 2,
crossAxisSpacing: 40.0,
mainAxisSpacing: 40.0,
padding: const EdgeInsets.all(20.0),
children: _items,
),
],
),
),
);
}
}
Когда он запускается, я получаю ошибку переполнения renderflex:
Когда я оборачиваю свой gridview в расширенный виджет, как было предложено в некоторых ответах, прокрутка выходит за пределы:
Цените помощь!
4 ответа
Удалите развернутую и оберните безопасную область с помощью SingleChildScrollView, а также добавьте phyiscs: ScrollPhysics () в gridview
Оберните колонку
SingleChildScrollView
, Столбец всегда будет пытаться сжать свои дочерние элементы, используя
Expanded
сообщает, чтобы он занимал только доступное пространство.
Другой альтернативой является использование
shrink-wrap: true
и использовать
physics: const NeverScrollablePhyscis()
, таким образом
GridView
не будет пытаться вырасти до бесконечности.
Вам нужно использовать комбинацию
Stack
,
ListView
а также
Column
виджеты. Вот как это сделать:
return Scaffold(
body: SafeArea(
child: Stack(
children: [
SizedBox(height: 16),
ListView(
shrinkWrap: true,
children: [
GridView.count(
primary: true,
shrinkWrap: true,
crossAxisCount: 2,
crossAxisSpacing: 40.0,
mainAxisSpacing: 40.0,
padding: const EdgeInsets.all(20.0),
children: [
Container(
margin: EdgeInsets.all(20),
color: Colors.red,
height: 200,
width: 200,
),
Container(
margin: EdgeInsets.all(20),
color: Colors.amber,
height: 200,
width: 200,
),
Container(
margin: EdgeInsets.all(20),
color: Colors.blue,
height: 200,
width: 200,
),
Container(
margin: EdgeInsets.all(20),
color: Colors.green,
height: 200,
width: 200,
),
],
),
],
),
Container(
color: Colors.white,
height: MediaQuery.of(context).size.height * 0.2,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 22),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("Hello, Guest!"),
Icon(
Icons.ac_unit,
color: Colors.blue,
size: 32.0,
),
],
),
SizedBox(height: 14),
Text("What worries you now? Select or Add."),
],
),
),
],
),
),
);
Вы можете завернуть
Column
внутри
SingleChildScrollView
виджет, чтобы прокручивать весь столбец. Код должен быть:
class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child:Column(
children: [
Container(
margin: EdgeInsets.only(left: 24, right: 24),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 22),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Message("Hello, Guest!", size: 32),
Icon(
CustomIcons.statistics,
color: AppColors.blue,
size: 32.0,
),
],
),
SizedBox(height: 14),
Message("What worries you now? Select or Add.", size: 14),
],
),
),
SizedBox(height: 16),
SingleChildScrollView(
child: GridView.count(
primary: true,
shrinkWrap: true,
crossAxisCount: 2,
crossAxisSpacing: 40.0,
mainAxisSpacing: 40.0,
padding: const EdgeInsets.all(20.0),
children: _items,
),
),
],
),
),
);
}
}