Код: Выделить всё
Scaffold(
extendBody: true,
extendBodyBehindAppBar: false,
body: NotificationListener(
onNotification: _handleScrollNotification,
child: CustomScrollView(
controller: _scrollController,
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
slivers: [
SliverAppBar(
floating: true,
snap: false,
pinned: true,
// Some code here
),
CupertinoSliverRefreshControl(
// Some code here
),
SliverList(
delegate: SliverChildBuilderDelegate(
childCount: 1,
// addAutomaticKeepAlives: true,
(context, index) => Container(
padding: screenContentPadding,
child: SingleChildScrollView(
child: Column(
children: [
Center(
child: SizedBox(
// height: MediaQuery.sizeOf(context).height,
// Problem lies down here
child: MasonryGridView.count(
primary: false,
shrinkWrap: false,
cacheExtent: 100.0,
addAutomaticKeepAlives: false,
crossAxisCount: 2,
itemBuilder: (context, index) {
return items[index];
},
),
),
),
],
),
),
),
),
),
],
),
),
),
Из того, что я сделал читай, без термоусадочной оболочки элементы длинного списка не будут отображаться все сразу, а только видимые. Это моя цель для MasonryGridView, в котором у меня много элементов.
Поначалу, когда я установил для термоусадки значение true, единственной проблемой, с которой я столкнулся, была проблема с рендерингом (запаздывающее поведение), с которой я столкнулся. хотел бы исправить.
Но когда я установил для термоусадки значение false, он сказал, что у меня неограниченная высота или что-то в этом роде, поэтому я раскомментировал эту строку:
Код: Выделить всё
... height: MediaQuery.sizeOf(context).height, ...
Он больше не жалуется на неограниченную высоту, но теперь мой sliverAppBar не работает так, как раньше предполагалось.
Поэтому я попытался поместить NeverScrollableScrollPhysics() в качестве физического параметра для класса MasonryGridView. SliverAppBar работает нормально, но теперь я получаю обрезанный вид элемента (из MasonryGridView), поскольку MediaQuery.sizeOf(context).height охватывает только некоторые элементы. Затем я попытался увеличить длину SizedBox на основе высоты дочерних элементов MasonryGridView, больше не зависящей от MediaQuery.sizeOf(context).height, но теперь термоусадочная пленка не работает , он возвращается к рендерингу всех элементов одновременно.
Я думаю, это потому, что теперь flutter думает, что вся область SizedBox (которая охватывает все дочерние элементы MasonryGridView ) действовал так, как если бы это было все видимое представление, поэтому теперь он отображает все дочерние элементы в видимом представлении одновременно.
Как исправить такое замедленное поведение?
Примечание: я думаю, это не дублирующий вопрос. Речь идет не о текстовом виджете, и упаковка MasonryGridView в Flexible не помогает. Есть ли кто-нибудь, кто мог бы мне помочь с этим...?
Подробнее здесь: https://stackoverflow.com/questions/790 ... in-flutter
Мобильная версия