当用户向下滚动然后再次向上滚动时,如何阻止已经翻转的翻转卡片翻转回来?
How can I stop flip cards that have already been flipped from flipping back when user scrolls down and then scrolls back up again?
我的问题如标题所述 - 我有翻转卡片的网格视图。当我翻几张时,滚动过去然后向上滚动卡片已经翻转回来。我真的不希望发生这种情况,因为它应该是每次用户翻转卡片时都会将一个点添加到总数中,然后当他们将其翻转回来时从总数中减去一个点。我已经尝试过“AutomaticKeepAliveClientMixin”,它可以在我有另一个选项卡时保持状态,但它似乎无助于在我滚动时保持卡片翻转。
如果此处存在明显的解决方案而我错过了,请提前致歉。我确实尝试在网上找到解决方案。
这是我正在使用的飞镖文件中的代码:
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])),
],
),
),
),
);
})
),
);
}
}
非常感谢您的阅读。
我确实尝试过达到你想要的,我认为只有你使用列才有可能。我什至尝试使用简单的 ListView,但卡片仍然 return 到正面
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'),
),
),
)
);
}
}
您需要在 GridView
的 children 上使用 AutomaticKeepAliveClientMixin
因此,为您的卡片制作一个新的有状态小部件,并在那里使用 keepalive。
同样对于 AutomaticKeepAliveClientMixin
你需要在你的构建方法中调用 super.build(context);
我的问题如标题所述 - 我有翻转卡片的网格视图。当我翻几张时,滚动过去然后向上滚动卡片已经翻转回来。我真的不希望发生这种情况,因为它应该是每次用户翻转卡片时都会将一个点添加到总数中,然后当他们将其翻转回来时从总数中减去一个点。我已经尝试过“AutomaticKeepAliveClientMixin”,它可以在我有另一个选项卡时保持状态,但它似乎无助于在我滚动时保持卡片翻转。
如果此处存在明显的解决方案而我错过了,请提前致歉。我确实尝试在网上找到解决方案。 这是我正在使用的飞镖文件中的代码:
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])),
],
),
),
),
);
})
),
);
}
}
非常感谢您的阅读。
我确实尝试过达到你想要的,我认为只有你使用列才有可能。我什至尝试使用简单的 ListView,但卡片仍然 return 到正面
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'),
),
),
)
);
}
}
您需要在 GridView
AutomaticKeepAliveClientMixin
因此,为您的卡片制作一个新的有状态小部件,并在那里使用 keepalive。
同样对于 AutomaticKeepAliveClientMixin
你需要在你的构建方法中调用 super.build(context);