我想创建一个卡片列表,当从左边或右边刷卡时,水平滚动的卡片会以适合的效果对齐(Snap To Fit Effect).

每张卡片之间都有一定的间距,适合屏幕,如下图所示

enter image description here

除此之外,这些水平滚动列表元素应该包含在垂直滚动列表中.

我所能做的就是在Flutter 文档中按照下面的示例显示水平滚动卡片的列表.

class SnapCarousel extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final title = 'Horizontal List';

    return MaterialApp(
      title: title,
      home: Scaffold(
        appBar: AppBar(
          title: Text(title),
        ),
        body: Container(
          margin: EdgeInsets.symmetric(vertical: 20.0),
          height: 200.0,
          child: ListView(
            scrollDirection: Axis.horizontal,
            children: <Widget>[
              Container(
                width: 160.0,
                color: Colors.red,
              ),
              Container(
                width: 160.0,
                color: Colors.blue,
              ),
              Container(
                width: 160.0,
                color: Colors.green,
              ),
              Container(
                width: 160.0,
                color: Colors.yellow,
              ),
              Container(
                width: 160.0,
                color: Colors.orange,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

推荐答案

使用PageViewListView:

import 'package:flutter/material.dart';

main() => runApp(MaterialApp(home: MyHomePage()));

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Carousel in vertical scrollable'),
      ),
      body: ListView.builder(
        padding: EdgeInsets.symmetric(vertical: 16.0),
        itemBuilder: (BuildContext context, int index) {
          if(index % 2 == 0) {
            return _buildCarousel(context, index ~/ 2);
          }
          else {
            return Divider();
          }
        },
      ),
    );
  }

  Widget _buildCarousel(BuildContext context, int carouselIndex) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        Text('Carousel $carouselIndex'),
        SizedBox(
          // you may want to use an aspect ratio here for tablet support
          height: 200.0,
          child: PageView.builder(
            // store this controller in a State to save the carousel scroll position
            controller: PageController(viewportFraction: 0.8),
            itemBuilder: (BuildContext context, int itemIndex) {
              return _buildCarouselItem(context, carouselIndex, itemIndex);
            },
          ),
        )
      ],
    );
  }

  Widget _buildCarouselItem(BuildContext context, int carouselIndex, int itemIndex) {
    return Padding(
      padding: EdgeInsets.symmetric(horizontal: 4.0),
      child: Container(
        decoration: BoxDecoration(
          color: Colors.grey,
          borderRadius: BorderRadius.all(Radius.circular(4.0)),
        ),
      ),
    );
  }
}

Flutter相关问答推荐

飘动的文本用/字符绕转

当第二页在单独的小工具中使用Navigator.pop时,Navigator.push不起作用

如何在Flutter 中播放音频

Flutter 中的面向对象模式

在setState之后,Ffltter ListView.Builder未更新

Wired Firebase错误-[CLOUD_FIRESTORE/UNAvailable]该服务当前不可用

Supabase Auth:重定向到 Google.com 而不是我的应用程序

了解多Provider 和流

构建上下文不能跨异步间隙使用

无状态和有状态小部件,我可以同时使用吗?

如果有空间则居中CustomScrollView

仅在获取(读取)、Provider 时,Firestore 中的数据为空

如何计算 Firestore 集合中的文档数量?

Flutter:如何在 bottomsheet 中创建一个日期 Select 器,如下图所示

Flutterfire Configure - 未处理的异常和没有 firebase 初始化

flutter 在文本字段中更改部分文本选定 colored颜色

.info/connected 这两个代码之间有什么区别吗?

如何防止卡子在底部溢出?

我的主屏幕上的 FutureBuilder 不断重新加载(但仅在其他屏幕上时)?

Flutter 平台通道将多数据传递给 windows 功能