养小猫咪的伙伴来我的店铺逛逛吧!抖音商城搜索#早睡早起的猫咪小铺子

学着写一下滑动页面

pageview实现左右滑动视图

class SlidingContainer extends StatefulWidget {  const SlidingContainer({super.key});  @override  State createState() => _SlidingContainerState();}class _SlidingContainerState extends State {  late PageController pageController;  double pageOffset = 0;  @override  void initState() {    // TODO: implement initState    super.initState();    pageController = PageController(viewportFraction: 0.84);    pageController.addListener(() {      setState(() => pageOffset = pageController.page!);    });  }  @override  void dispose() {    // TODO: implement dispose    super.dispose();  }  Widget build(BuildContext context) {    return SizedBox(      height: MediaQuery.of(context).size.height * 0.55,      child: PageView(        controller: pageController,        children: List.generate(movies.length, (index) {          return SlidingCard(            offset: pageOffset - index,            movie: movies[index],          );        }),      ),    );  }}

运用Card来绘制图层,简单又方便

class SlidingCard extends StatelessWidget {  final double offset;  final Movie movie;  const SlidingCard({super.key, required this.offset, required this.movie});  @override  Widget build(BuildContext context) {    double gauss = math.exp(-(math.pow((offset.abs() - 0.5), 2) / 0.08));    return Transform.translate(      offset: Offset(-32 * gauss * offset.sign, 0),      child: Card(        margin: EdgeInsets.only(left: 8, right: 8, bottom: 8),        elevation: 8,        shape: RoundedRectangleBorder(          borderRadius: BorderRadius.circular(32),        ),        child: Column(          children: [            ClipRRect(              borderRadius: BorderRadius.vertical(                top: Radius.circular(32),              ),              child: Image.asset(                                '${movie.pic}',                // height: MediaQuery.of(context).size.height * 0.3,                alignment: Alignment(-offset.abs(), 0),                fit: BoxFit.cover,              ),            ),            SizedBox(              height: 8,            ),            Expanded(              child: Padding(                padding: const EdgeInsets.all(8.0),                child: Column(                  crossAxisAlignment: CrossAxisAlignment.start,                  children: [                    Text(                      '${movie.name}',                      style:                          TextStyle(fontSize: 20, fontWeight: FontWeight.bold),                    ),                    SizedBox(                      height: 10,                    ),                    Text(                      '上架时间: ${movie.date}',                      style: TextStyle(                          fontSize: 14, fontWeight: FontWeight.normal),                    ),                    Text(                      '${movie.intor}',                      style: TextStyle(                        fontSize: 14,                        fontWeight: FontWeight.normal,                      ),                    ),                    Spacer(),                    Row(                      children: [                        SizedBox(width: 16,),                        Text(                          '${movie.price}',                          style: TextStyle(                              fontSize: 18, fontWeight: FontWeight.bold),                        ),                        Spacer(),                        MaterialButton(                          onPressed: () {},                          color: Colors.black,                          child: Text('购买'),                          textColor: Colors.white,                          shape: RoundedRectangleBorder(                            borderRadius: BorderRadius.circular(32),                          ),                        ),                        SizedBox(width: 16,),                      ],                    ),                  ],                ),              ),            ),          ],        ),      ),    );  }}class $ {}