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样式

实现效果

相关推荐
LawrenceLan3 分钟前
Flutter 零基础入门(二十三):Icon、Image 与资源管理
开发语言·前端·flutter·dart
m0_748252387 分钟前
Java 变量类型
java·数据结构·windows
津津有味道12 分钟前
WEB浏览器网页读写Desfire EV1 EV2 EV3卡,修改DES、3DES、AES密钥JS源码JavaScript
前端·javascript·nfc·desfire·ev2·ev3·ev1
caleb_52013 分钟前
基于springmvc系统,如何跟踪会话过期,浏览器会话标识是否收到正常响应,存储,并在后续请求保持携带
java
luyun02020216 分钟前
精简版本,绿色便携
java·windows·figma
JMchen12317 分钟前
Android Activity管理工具类
android·java·学习·移动开发·android-studio
AugustRed17 分钟前
net.bytebuddy字节码引擎,动态生成Java类
java·开发语言
青衫码上行25 分钟前
SpringBoot多环境配置
java·spring boot·后端·学习
爬山算法27 分钟前
Hibernate(54)Hibernate中的批量更新如何实现?
java·后端·hibernate
Elieal27 分钟前
零基础入门 WebSocket:从原理到 Java 实战
java·websocket·网络协议