Сегодня расскажу еще про один инструмент, который может принести больше проблем, чем пользы —
shrinkWrap: true.Если вы сталкивались с проблемой неограниченного размера ListView, то могли наткнуться на советы установить этот виджет. Это и правда решит проблему красного экрана:
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Column(
children: [
ListView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: 10000,
itemBuilder: (_, __) => const Text('Hello World!'),
),
],
),
);
}
Но теперь при переходе на экран с этим виджетом приложение зависает на несколько секунд. Высота виджета становится определенной для фреймворка, но ради этого мы сильно жертвуем производительностью.
Как сделать лучше?
Самый простой способ — использовать Expanded или Flexible.
@override
Widget build(BuildContext context) {
return Column(
children: [
Flexible(
child: ListView.builder(
itemCount: 10000,
itemBuilder: (_, __) => const Text('Hello World!'),
),
),
],
);
}
❗️Если проблема возникла из-за использования ListView внутри другого ScrollView (к примеру, ListView внутри SingleChildScrollView), то поможет замена этих виджетов на CustomScrollView и SliverList.