Flutter中多个FlipCard的动态排布问题

问题描述

在使用Flutter的FlipCard组件后发现了一些问题,FlipCard组件会预留位置,预留的位置取决于正反翻面的最大一面。

如上图,我的两个单词卡片均使用的FlipCard组件,我的反面比正面长度要长,在两个组件均展示正面时,会默认为翻转后的反面保留一段距离,但我希望的效果是,两个组件的间距可以随着翻转自定义调整

解决方法

在查看了FlipCard的源码后,我自定义了FlipCard,重新定义的FilpCard代码如下:

java 复制代码
import 'package:flutter/material.dart';  
import 'dart:math';  
  
class AdjustFlipCard extends StatefulWidget {  
final Widget front;  
final Widget back;  
final int speed;  
  
AdjustFlipCard({  
Key? key,  
required this.front,  
required this.back,  
this.speed = 500,  
}) : super(key: key);  
  
@override  
_AdjustFlipCardState createState() => _AdjustFlipCardState();  
}  
  
class _AdjustFlipCardState extends State<AdjustFlipCard> with SingleTickerProviderStateMixin {  
late AnimationController _controller;  
late Animation<double> _rotation;  
  
@override  
void initState() {  
super.initState();  
_controller = AnimationController(  
duration: Duration(milliseconds: widget.speed),  
vsync: this,  
);  
_rotation = Tween<double>(begin: 0.0, end: 1.0).animate(  
CurvedAnimation(parent: _controller, curve: Curves.linear),  
);  
}  
  
void _toggleCard() {  
if (_controller.isDismissed) {  
_controller.forward();  
} else {  
_controller.reverse();  
}  
}  
  
@override  
Widget build(BuildContext context) {  
return GestureDetector(  
onTap: _toggleCard,  
child: AnimatedBuilder(  
animation: _rotation,  
builder: (context, child) {  
final isFront = _controller.value < 0.5;  
final transform = Matrix4.identity()..setEntry(3, 2, 0.001);  
transform.rotateY(_controller.value * pi);  
  
return Transform(  
transform: transform,  
alignment: Alignment.center,  
child: isFront ? widget.front : Transform(  
transform: Matrix4.identity()..rotateY(pi),  
alignment: Alignment.center,  
child: widget.back,  
),  
);  
},  
),  
);  
}  
  
@override  
void dispose() {  
_controller.dispose();  
super.dispose();  
}  
}

在自定义的AdjustFlipCard中,仍然定义了正面front,反面back,保留了翻转的动画,调用该卡片,调用代码示例如下:

java 复制代码
return AdjustFlipCard(  
key: cardKey,  
front: frontCard,  
back: backCard,  
);
Widget frontCard =Card();  //定义你的frontCard样式
Widget backCard =Card(); //定义你的backCard样式

实现效果

相关推荐
呼啦啦啦啦啦啦啦啦38 分钟前
常见的排序算法
java·算法·排序算法
百万蹄蹄向前冲1 小时前
Trae分析Phaser.js游戏《洋葱头捡星星》
前端·游戏开发·trae
anlogic1 小时前
Java基础 8.18
java·开发语言
朝阳5812 小时前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路2 小时前
GeoTools 读取影像元数据
前端
练习时长一年2 小时前
AopAutoConfiguration源码阅读
java·spring boot·intellij-idea
ssshooter3 小时前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
源码宝3 小时前
【智慧工地源码】智慧工地云平台系统,涵盖安全、质量、环境、人员和设备五大管理模块,实现实时监控、智能预警和数据分析。
java·大数据·spring cloud·数据分析·源码·智慧工地·云平台
Jerry3 小时前
Jetpack Compose 中的状态
前端
David爱编程4 小时前
面试必问!线程生命周期与状态转换详解
java·后端