在 Flutter 中使用 GridView 时使轮播向上滚动

Posted

技术标签:

【中文标题】在 Flutter 中使用 GridView 时使轮播向上滚动【英文标题】:Make the carousel scroll up while using a GridView in Flutter 【发布时间】:2020-11-03 01:32:32 【问题描述】:

我当前的小部件树是这样的:

return Container(
  child: SingleChildScrollView(
    child: Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        myCarouselWidget(),
        GridView.count(
          physics: NeverScrollableScrollPhysics(),
          crossAxisCount: 2,
          padding: EdgeInsets.all(8),
          childAspectRatio: 3 / 4,
          crossAxisSpacing: 10,
          mainAxisSpacing: 10,
          children: myDummyProductList,
        ),
      ],
    ),
  ),
);

现在我想要的是,当我滚动时,轮播应该向上滚动,而 gridView 应该逐渐覆盖整个页面。

我尝试了什么:

    物理:NeverScrollableScrollPhysics() 删除 SingleChildScrollView 并将 GridView 包装在 Expanded 小部件中有效,但轮播不会向上滚动。

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

网格的主轴方向是它滚动的方向。 最常用的网格布局是GridView.count,它创建一个在横轴上具有固定数量的瓦片的布局,以及GridView.extent,它创建一个具有最大横轴范围的瓦片的布局。自定义 SliverGridDelegate 可以生成任意 2D 子元素排列,包括未对齐或重叠的排列。

CustomScrollView(
  primary: false,
  slivers: <Widget>[
    SliverPadding(
      padding: const EdgeInsets.all(20),
      sliver: SliverGrid.count(
        crossAxisSpacing: 10,
        mainAxisSpacing: 10,
        crossAxisCount: 2,
        children: <Widget>[
          Container(
            padding: const EdgeInsets.all(8),
            child: const Text("He'd have you all unravel at the"),
            color: Colors.green[100],
          ),
          Container(
            padding: const EdgeInsets.all(8),
            child: const Text('Heed not the rabble'),
            color: Colors.green[200],
          ),
          Container(
            padding: const EdgeInsets.all(8),
            child: const Text('Sound of screams but the'),
            color: Colors.green[300],
          ),
          Container(
            padding: const EdgeInsets.all(8),
            child: const Text('Who scream'),
            color: Colors.green[400],
          ),
          Container(
            padding: const EdgeInsets.all(8),
            child: const Text('Revolution is coming...'),
            color: Colors.green[500],
          ),
          Container(
            padding: const EdgeInsets.all(8),
            child: const Text('Revolution, they...'),
            color: Colors.green[600],
          ),
        ],
      ),
    ),
  ],
)

【讨论】:

我了解 Silver child 的使用,但正如我提到的,我还必须在卷轴中添加轮播部分,这不是 Silver。我正在将此库用于轮播 pub.dev/packages/carousel_pro 它是 RenderBox 而不是 RenderSilver。【参考方案2】:

经过一番修补和研究,我找到了解决方案。简而言之,我使用了 CustomScrollView 并将轮播放在 SliverAppBar 中,当我向上滚动时它会隐藏起来。这是我现在的 Widget 树:

return Container(
  child: CustomScrollView(
    slivers: [
      SliverAppBar(
        floating: false,
        pinned: true,
        elevation: 4,
        backgroundColor: Theme.of(context).primaryColor,
        expandedHeight: carouselHeight,
        title: Text(
          "MyTitle",
        ),
        flexibleSpace: FlexibleSpaceBar(
          background: myCarousel
        ),
      ),
      SliverPadding(
        padding: EdgeInsets.all(14),
        sliver: SliverGrid.count(
          crossAxisCount: 2,
          childAspectRatio: 3 / 4,
          crossAxisSpacing: 10,
          mainAxisSpacing: 10,
          children: myDummyProductList,
        ),
      ),
    ],
  ),
);

【讨论】:

以上是关于在 Flutter 中使用 GridView 时使轮播向上滚动的主要内容,如果未能解决你的问题,请参考以下文章

在列标题单击时使 WPF ListView/GridView 排序的最佳方法?

在 Flutter 的 GridView 中显示资产图像?

flutter网格布局之GridView组件

flutter 系列之:flutter 中常用的 GridView layout 详解

Flutter:在 GridView 中选择卡片

在 Flutter 的 GridView 中显示图像?