Horizontally scrollable cards with Snap effect in flutter

前端 未结 3 721
广开言路
广开言路 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: <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)),
            ),
          ),
        );
      }
    }
    
    0 讨论(0)
  • 2020-12-04 08:29

    this is an old question, and I arrived here looking for something else ;-), but what WitVault was lookig is done easy with this package: https://pub.dev/packages/flutter_swiper

    The implementation:

    Put the dependencies in pubsec.yaml:

    dependencies:
       flutter_swiper: ^1.1.6
    

    Import it in the page where you need it:

    import 'package:flutter_swiper/flutter_swiper.dart';
    

    In the layout:

    new Swiper(
      itemBuilder: (BuildContext context, int index) {
        return new Image.network(
          "http://via.placeholder.com/288x188",
          fit: BoxFit.fill,
        );
      },
      itemCount: 10,
      viewportFraction: 0.8,
      scale: 0.9,
    )
    
    0 讨论(0)
  • 2020-12-04 08:38

    Screenshot:


    If you don't want to use any 3rd party packages, you can simply try this:

    class _HomePageState extends State<HomePage> {
      int _index = 0;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(),
          body: Center(
            child: SizedBox(
              height: 200, // card height
              child: PageView.builder(
                itemCount: 10,
                controller: PageController(viewportFraction: 0.7),
                onPageChanged: (int index) => setState(() => _index = index),
                itemBuilder: (_, i) {
                  return Transform.scale(
                    scale: i == _index ? 1 : 0.9,
                    child: Card(
                      elevation: 6,
                      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
                      child: Center(
                        child: Text(
                          "Card ${i + 1}",
                          style: TextStyle(fontSize: 32),
                        ),
                      ),
                    ),
                  );
                },
              ),
            ),
          ),
        );
      }
    }
    
    0 讨论(0)
提交回复
热议问题