Android 当用户向下滚动,然后再次向上滚动时,如何阻止已翻转的翻页卡反向翻转?
我的问题是标题所说的——我有一个翻转卡片的网格视图。当我翻过几张牌时,从它们旁边滚动过去,然后向上滚动,这些牌已经翻过了。我真的不希望发生这种情况,因为每次用户翻牌时,总积分中会增加一分,然后当他们翻牌时,总积分中会减少一分。我尝试过“AutomaticKepaLiveClientMixin”,它可以在我有另一个选项卡时保持状态,但它似乎不能帮助我在滚动时保持卡片翻转 如果这里有一个明显的解决方案,而我错过了,请提前道歉。我确实试着在网上找到解决办法。 下面是我正在使用的dart文件中的代码:Android 当用户向下滚动,然后再次向上滚动时,如何阻止已翻转的翻页卡反向翻转?,android,android-studio,flutter,dart,gridview,Android,Android Studio,Flutter,Dart,Gridview,我的问题是标题所说的——我有一个翻转卡片的网格视图。当我翻过几张牌时,从它们旁边滚动过去,然后向上滚动,这些牌已经翻过了。我真的不希望发生这种情况,因为每次用户翻牌时,总积分中会增加一分,然后当他们翻牌时,总积分中会减少一分。我尝试过“AutomaticKepaLiveClientMixin”,它可以在我有另一个选项卡时保持状态,但它似乎不能帮助我在滚动时保持卡片翻转 如果这里有一个明显的解决方案,而我错过了,请提前道歉。我确实试着在网上找到解决办法。 下面是我正在使用的dart文件中的代码:
import 'package:flutter/material.dart';
import 'package:flip_card/flip_card.dart';
import 'statenames.dart';
import 'globalVariables.dart';
StateNames stateObject = new StateNames();
class GridOne extends StatefulWidget {
final Function updateCounter;
final Function decreaseCount;
GridOne(this.updateCounter, this.decreaseCount);
@override
_GridOneState createState() => _GridOneState();
}
class _GridOneState extends State<GridOne>
with AutomaticKeepAliveClientMixin {
@override
bool get wantKeepAlive => true;
int points = 0;
@override
Widget build(BuildContext context) {
return new Scaffold(
body: GridView.count(
crossAxisCount: 4,
children: List.generate(52, (index){
return Card(
elevation: 0.0,
margin: EdgeInsets.only(left: 3.0, right: 3.0, top: 9.0, bottom: 0.0),
color: Color(0x00000000),
child: FlipCard(
direction: FlipDirection.HORIZONTAL,
speed: 1000,
onFlipDone: (status) {
setState(() {
(status)
? widget.decreaseCount()
: widget.updateCounter();
});
print(counter);
},
front: Container(
decoration: BoxDecoration(
color: Color(0xFF006666),
borderRadius: BorderRadius.all(Radius.circular(8.0)),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
FittedBox(fit:BoxFit.fitWidth,
child: Text(stateObject.stateNames[index], style: TextStyle(fontFamily: 'Architects Daughter', color: Colors.white), )
),
Text('',
style: Theme.of(context).textTheme.body1),
],
),
),
back: Container(
decoration: BoxDecoration(
color: Color(0xFF006666),
borderRadius: BorderRadius.all(Radius.circular(8.0)),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image(image: AssetImage(stateObject.licensePlatePaths[index])),
],
),
),
),
);
})
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“包装:flip_卡/flip_卡.dart”;
导入“statenames.dart”;
导入“globalVariables.dart”;
StateNames stateObject=新StateNames();
类GridOne扩展了StatefulWidget{
最终函数updateCounter;
最终函数递减计数;
GridOne(this.updateCounter,this.decreaseCount);
@凌驾
_GridOneState createState()=>\u GridOneState();
}
类GridOneState扩展了状态
使用AutomaticEpaLiveClientMixin{
@凌驾
bool get wantKeepAlive=>true;
积分=0;
@凌驾
小部件构建(构建上下文){
归还新脚手架(
正文:GridView.count(
交叉轴计数:4,
子项:List.generate(52,(索引){
回程卡(
标高:0.0,
边距:仅限边集(左侧:3.0,右侧:3.0,顶部:9.0,底部:0.0),
颜色:颜色(0x00000000),
孩子:FlipCard(
方向:翻转方向。水平,
速度:1000,
onFlipDone:(状态){
设置状态(){
(现状)
?widget.decreaseCount()
:widget.updateCounter();
});
打印(计数器);
},
正面:集装箱(
装饰:盒子装饰(
颜色:颜色(0xFF006666),
borderRadius:borderRadius.all(半径.圆形(8.0)),
),
子:列(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
FittedBox(配合:BoxFit.fittewidth,
子项:文本(stateObject.stateNames[index],样式:TextStyle(fontFamily:'Architects-Children',颜色:Colors.white),)
),
文本(“”,
风格:Theme.of(context.textTheme.body1),
],
),
),
背面:集装箱(
装饰:盒子装饰(
颜色:颜色(0xFF006666),
borderRadius:borderRadius.all(半径.圆形(8.0)),
),
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
图像(图像:AssetImage(stateObject.licenseplatepath[index]),
],
),
),
),
);
})
),
);
}
}
非常感谢您的阅读。我点击了试用版以实现您的需求,我认为只有在您使用本专栏的情况下才有可能。我甚至尝试过使用简单的ListView,但卡片仍然会返回正面
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Test(),
);
}
}
class Test extends StatefulWidget{
@override
_Test createState() => _Test();
}
class _Test extends State<Test>{
List<Widget> list = [];
_Test(){
list = new List.filled(30, flipCards());
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Column(
children: list,
),
)
);
}
Widget flipCards(){
return Container(
height: 70,
child: FlipCard(
flipOnTouch: true,
front: Card(
child: Container(
alignment: Alignment.center,
child: Text('Toggle'),
),
),
back: Card(
child: Container(
alignment: Alignment.center,
child: Text('Back'),
),
),
)
);
}
}
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:Test(),
);
}
}
类测试扩展了StatefulWidget{
@凌驾
_Test createState()=>u Test();
}
类测试扩展了状态{
列表=[];
_测试(){
列表=新列表。已填充(30,flipCards());
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:SingleChildScrollView(
子:列(
儿童:名单,
),
)
);
}
小部件动画卡(){
返回容器(
身高:70,
孩子:FlipCard(
真的,
正面:卡片(
子:容器(
对齐:对齐.center,
子项:文本(“切换”),
),
),
背面:卡片(
子:容器(
对齐:对齐.center,
子项:文本('Back'),
),
),
)
);
}
}
您需要在GridView的子级上使用AutomaticEpaLiveClientMixin
因此,为您的卡制作一个新的有状态小部件,并在那里使用keepalive。
同样对于automatickepaliveclientmixin
您需要调用super.build(上下文)代码>在您的构建方法中谢谢,我一直在仔细研究它以找出如何做到这一点(新手,抱歉!)我想我需要在另一个有状态的小部件中构建卡片小部件,并从_gridonestatex多次调用这些小部件来创建它们?我花了太多时间试图找出如何实现第二个人的答案,几分钟前才尝试了这一个,它工作得非常完美(我现在只需要让它们像一行列一样)。非常感谢lol。如果ans解决了您的问题,您可以向上投票并将其标记为正确的ans。谢谢。我太新了,显然不能投票,但我把它作为答案。非常感谢你!