我需要创建以下效果.我使用了VerticalCardPager,并对其做了一些小改动,以使所有卡片的宽度相等.但我没能得到想要的结果.有谁能给出实现这一点的 idea 吗?

enter image description here

推荐答案

VerticalCardPager库需要改进,因为它为所有子对象运行循环,即使它们没有被绘制也会计算.

我try 了不同的方法,并使其与以下代码一起工作.

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Pager Demo',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _upcomingPage = 0;
  final _pageController = PageController(viewportFraction: 0.6);

  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final List<String> titles = [
      "RED",
      "YELLOW",
      "BLACK",
      "CYAN",
      "BLUE",
      "GREY",
    ];

    final List<Widget> images = [
      Container(
        color: Colors.pink[800],
      ),
      Container(
        color: Colors.purple[800],
      ),
      Container(
        color: Colors.black,
      ),
      Container(
        color: Colors.deepOrange[800],
      ),
      Container(
        color: Colors.indigo[800],
      ),
      Container(
        color: Colors.green[800],
      ),
    ];
    return Scaffold(
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 12),
          child: GestureDetector(
            onVerticalDragEnd: (details) {
              if ((details.primaryVelocity ?? 0) > 0) {
                _upcomingPage = (_pageController.page?.toInt() ?? 0) - 1;
                _pageController.previousPage(
                    duration: const Duration(milliseconds: 300),
                    curve: Curves.linear);
              } else if ((details.primaryVelocity ?? 0) < 0) {
                _upcomingPage = (_pageController.page?.toInt() ?? 0) + 1;
                _pageController.nextPage(
                    duration: const Duration(milliseconds: 300),
                    curve: Curves.linear);
              }
              if (_upcomingPage < 0) {
                _upcomingPage = 0;
              }
              if (_upcomingPage == images.length) {
                _upcomingPage = images.length - 1;
              }
              setState(() {});
            },
            child: PageView.builder(
              physics: const NeverScrollableScrollPhysics(),
              scrollDirection: Axis.vertical,
              controller: _pageController,
              itemBuilder: (context, index) {
                final Alignment align;
                final double heightFactor;
                if (index < _upcomingPage) {
                  align = Alignment.bottomCenter;
                  heightFactor = 0.3;
                } else if (index > _upcomingPage) {
                  align = Alignment.topCenter;
                  heightFactor = 0.3;
                } else {
                  align = Alignment.center;
                  heightFactor = 1;
                }

                return Padding(
                  padding: const EdgeInsets.symmetric(vertical: 12),
                  child: FractionallySizedBox(
                    alignment: align,
                    child: AnimatedFractionallySizedBox(
                      duration: const Duration(milliseconds: 300),
                      heightFactor: heightFactor,
                      alignment: align,
                      child: Stack(children: [
                        // modify your items here.
                        images[index],
                        Center(
                          child: Text(
                            titles[index],
                            style: const TextStyle(
                                fontSize: 24, color: Colors.white),
                          ),
                        )
                      ]),
                    ),
                  ),
                );
              },
              itemCount: images.length,
            ),
          ),
        ),
      ),
    );
  }
}

视频:https://youtu.be/dOg-ZvPrWSY

Flutter相关问答推荐

修复容器`Text`和容器表单之间的重叠

MobX Build_Runner问题:不生成.G文件(Flutter )

Flutter 布局-全屏幕容器

我有一个问题:类型';()=>;Null';不是类型转换中类型';(Int)=>;void';的子类型

如何将Xpriter代码页更改为代码页27?

查询满足AND条件的文档的FiRestore

'Flutter的无效常数值错误

Flutter Riverpod,将默认的BTC值改写为我的新状态

如何在Ffltter 3.16中设置标准的提升按钮主题?

抖动问题:检测到0个或2个或更多具有相同值的[DropdownMenuItem]

如何使用providerContainer监听/写入FutureProvider?

如何在 Flutter 中创建具有渐变背景色的自定义 Snackbar?

如何在flutter中更改showModalBottomSheet小部件中CheckboxListTile小部件的值?

Flutter中不使用Container是否可以做margin

如何在flutter中加载并显示adx锚定的自适应广告?

如何正确地将 PageView 设置为 AppBar 的标题?

如何在 flutter 的 onChanged(更改字符)处更改 TextField 边框 colored颜色 ?

如何按值对列表中的 map 进行排序

在 Flutter 中单击时切换按钮 colored颜色 没有改变

如何将图像网络装箱到具有边界半径的容器中