Horizontally scrollable cards with Snap effect in flutter

前端 未结 3 724
广开言路
广开言路 2020-12-04 07:57

I want to create a list of cards scrolling horizontally with snap to fit effect when swiped either from left or right.

Each card has some spacing between them and fi

3条回答
  •  无人及你
    2020-12-04 08:18

    Use PageView and ListView:

    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: [
            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)),
            ),
          ),
        );
      }
    }
    

提交回复
热议问题