Android studio 如何从另一个dart文件中的小部件将翻转卡返回到其原始位置?
我对Flitter还比较陌生,曾试图找到类似的帖子来帮助我,但不幸的是,我没有运气让它们为我工作。我有一个Android Studio程序,它基本上是一个游戏,包含一个翻转卡片网格。我在一个dart文件中有翻转卡,在另一个dart文件中有应用程序栏。我在应用程序栏上有一个图标按钮,当前将点数减少到零,但我也希望它在按下时将所有翻盖卡翻转回其原始位置。我一直在尝试使用一个名为resetBool的全局变量,比如如果resetBool==true,那么可能是toggleCard()。我想我可能需要使用一个密钥,但在正确实现一个密钥时遇到了困难 以下是包含我的appbar的文件中的代码:Android studio 如何从另一个dart文件中的小部件将翻转卡返回到其原始位置?,android-studio,flutter,dart,gridview,key,Android Studio,Flutter,Dart,Gridview,Key,我对Flitter还比较陌生,曾试图找到类似的帖子来帮助我,但不幸的是,我没有运气让它们为我工作。我有一个Android Studio程序,它基本上是一个游戏,包含一个翻转卡片网格。我在一个dart文件中有翻转卡,在另一个dart文件中有应用程序栏。我在应用程序栏上有一个图标按钮,当前将点数减少到零,但我也希望它在按下时将所有翻盖卡翻转回其原始位置。我一直在尝试使用一个名为resetBool的全局变量,比如如果resetBool==true,那么可能是toggleCard()。我想我可能需要使用
import 'package:flip_card/flip_card.dart';
import 'package:flutter/material.dart';
import 'gridone.dart' as gridone;
import 'globalVariables.dart';
import 'statenames.dart';
int count;
StateNames stateObject = new StateNames();
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home>with SingleTickerProviderStateMixin {
TabController controller;
@override
void initState() {
controller = new TabController(length: 1, vsync: this);
super.initState();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
void changeCount() {
setState(() {
counter += 1;
});
}
void decreaseCount() {
setState(() {
counter -= 1;
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title:new Text("License plate game"),
backgroundColor: Colors.greenAccent,
actions: <Widget>[
IconButton(
icon: Icon(
Icons.autorenew,
color: Colors.white,
),
onPressed: () {
setState(() {
counter = 0;
resetBool = true;
});
},
),
Center(
child: Container(
padding: EdgeInsets.fromLTRB(20, 20, 20, 20),
child: Text('points: $counter', textAlign: TextAlign.center, style: TextStyle(fontSize: 15),
)
),
),
],
bottom: new TabBar(
controller: controller,
indicatorWeight: 5.0,
indicatorColor: Colors.green,
tabs: <Widget> [
new Tab(icon: new Icon(Icons.image),),
],
),
),
body: new TabBarView(
controller: controller,
children: <Widget>[
new gridone.GridOne(changeCount, decreaseCount),
],
)
);
}
}
import'包:flip_卡/flip_卡.dart';
进口“包装:颤振/材料.省道”;
导入'gridone.dart'作为gridone;
导入“globalVariables.dart”;
导入“statenames.dart”;
整数计数;
StateNames stateObject=新StateNames();
类Home扩展了StatefulWidget{
@凌驾
_HomeState createState()=>\u HomeState();
}
类_HomeState使用SingleTickerProviderStateMixin扩展stateMixin{
tab控制器;
@凌驾
void initState(){
控制器=新的TabController(长度:1,vsync:this);
super.initState();
}
@凌驾
无效处置(){
controller.dispose();
super.dispose();
}
void changecont(){
设置状态(){
计数器+=1;
});
}
无效递减计数(){
设置状态(){
计数器-=1;
});
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(“车牌游戏”),
背景颜色:Colors.greenAccent,
行动:[
图标按钮(
图标:图标(
Icons.autorenew,
颜色:颜色,白色,
),
已按下:(){
设置状态(){
计数器=0;
resetBool=true;
});
},
),
居中(
子:容器(
填充:来自LTRB(20,20,20,20)的边缘设置,
子项:Text('points:$counter',textAlign:textAlign.center,style:TextStyle(fontSize:15),
)
),
),
],
底部:新选项卡栏(
控制器:控制器,
指示器重量:5.0,
指示颜色:颜色。绿色,
选项卡:[
新建选项卡(图标:新建图标(Icons.image)),
],
),
),
正文:新选项卡视图(
控制器:控制器,
儿童:[
新的gridone.gridone(更改计数、减少计数),
],
)
);
}
}
下面是包含我的翻转卡的文件中的代码:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flip_card/flip_card.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'statenames.dart';
import 'globalVariables.dart';
import 'Home.dart';
import 'gridtwo.dart' as gridTwo;
StateNames stateObject = new StateNames();
Home homeObject = new Home();
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) {
super.build(context);
return new Scaffold(
body: new Column(
children: <Widget> [
new Expanded(
child: GridView.count(
crossAxisCount: 5,
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,
//(resetBool == true) ? cardKey.currentState.toggleCard() : null,
onFlipDone: (status) {
setState(() {
(status)
? widget.decreaseCount()
: widget.updateCounter();
});
if (counter == 25) {
Fluttertoast.showToast(
msg: "You've got 25 states! Wow!",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM_LEFT,
timeInSecForIosWeb: 1,
backgroundColor: Colors.red,
textColor: Colors.white,
fontSize: 16.0);
};
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), )
//Theme.of(context).textTheme.headline
),
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])),
//Text('',
//style: Theme.of(context).textTheme.body1),
],
),
),
),
);
})
)
)
]
),
);
}
}
import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
导入“包装:flip_卡/flip_卡.dart”;
进口“包装:fluttoast/fluttoast.dart”;
导入“statenames.dart”;
导入“globalVariables.dart”;
输入“Home.dart”;
导入'gridtwo.dart'作为gridtwo;
StateNames stateObject=新StateNames();
Home homeObject=新家();
类GridOne扩展了StatefulWidget{
最终函数updateCounter;
最终函数递减计数;
GridOne(this.updateCounter,this.decreaseCount);
@凌驾
_GridOneState createState()=>\u GridOneState();
}
类GridOneState扩展了状态
使用AutomaticEpaLiveClientMixin{
@凌驾
bool get wantKeepAlive=>true;
积分=0;
@凌驾
小部件构建(构建上下文){
super.build(上下文);
归还新脚手架(
正文:新栏目(
儿童:[
新扩展(
子项:GridView.count(
交叉轴计数:5,
子项:List.generate(52,(索引){
回程卡(
标高:0.0,
边距:仅限边集(左侧:3.0,右侧:3.0,顶部:9.0,底部:0.0),
颜色:颜色(0x00000000),
孩子:FlipCard(
方向:翻转方向。水平,
速度:1000,
//(resetBool==true)?cardKey.currentState.toggleCard():null,
onFlipDone:(状态){
设置状态(){
(现状)
?widget.decreaseCount()
:widget.updateCounter();
});
如果(计数器==25){
烤面包片(
味精:“你有25个州!哇!”,
烤面包片长度:烤面包片长度,
重力:ToastGravity.BOTTOM_LEFT,
TimeInSecureForiosWeb:1,
背景颜色:Colors.red,
textColor:Colors.white,
体积:16.0),;
};
打印(计数器);
},
正面:集装箱(
装饰:盒子装饰(
颜色:颜色(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.headline
),
文本(“”,
风格:Theme.of(context.textTheme.body1),
],
),
),
背面:集装箱(
装饰:盒子装饰(
颜色:颜色(0xFF006666),
边界半径:博尔
List<GlobalKey<FlipCardState>> cardKeys = [];
@override
void initState() {
List.generate(52, (index) {
cardKeys.add(GlobalKey<FlipCardState>());
});
super.initState();
}
FlipCard(key: cardKeys[index], ... )
void resetCards() {
cardKeys.forEach((element) {
if (!element.currentState.isFront) {
element.currentState.toggleCard();
}
});
setState(() {});
}
import 'package:flutter/material.dart';
import 'package:flip_card/flip_card.dart';
import 'package:fluttertoast/fluttertoast.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
// This is the theme of your application.
//
// Try running your application with "flutter run". You'll see the
// application has a blue toolbar. Then, without quitting the app, try
// changing the primarySwatch below to Colors.green and then invoke
// "hot reload" (press "r" in the console where you ran "flutter run",
// or simply save your changes to "hot reload" in a Flutter IDE).
// Notice that the counter didn't reset back to zero; the application
// is not restarted.
primarySwatch: Colors.blue,
// This makes the visual density adapt to the platform that you run
// the app on. For desktop platforms, the controls will be smaller and
// closer together (more dense) than on mobile platforms.
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: Home(),
);
}
}
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> with SingleTickerProviderStateMixin {
TabController controller;
int counter = 0;
final GridOneController myController = GridOneController();
@override
void initState() {
controller = new TabController(length: 1, vsync: this);
super.initState();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
void changeCount() {
setState(() {
counter += 1;
});
}
void decreaseCount() {
setState(() {
counter -= 1;
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("License plate game"),
backgroundColor: Colors.greenAccent,
actions: <Widget>[
IconButton(
icon: Icon(
Icons.autorenew,
color: Colors.white,
),
onPressed: () {
setState(() {
counter = 0;
myController.resetCards();
});
},
),
Center(
child: Container(
padding: EdgeInsets.fromLTRB(20, 20, 20, 20),
child: Text(
'points: $counter',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 15),
)),
),
],
bottom: new TabBar(
controller: controller,
indicatorWeight: 5.0,
indicatorColor: Colors.green,
tabs: <Widget>[
new Tab(
icon: new Icon(Icons.image),
),
],
),
),
body: new TabBarView(
controller: controller,
children: <Widget>[
new GridOne(counter, myController),
],
));
}
}
class GridOneController {
void Function() resetCards;
}
class GridOne extends StatefulWidget {
int counter;
final GridOneController controller;
GridOne(this.counter, this.controller);
@override
_GridOneState createState() => _GridOneState(controller);
}
class _GridOneState extends State<GridOne> {
_GridOneState(GridOneController _controller) {
_controller.resetCards = resetCards;
}
int points = 0;
void increaseCounter() {
widget.counter += 1;
}
void decreaseCounter() {
widget.counter -= 1;
}
void resetCards() {
cardKeys.forEach((element) {
if (!element.currentState.isFront) {
element.currentState.toggleCard();
}
});
setState(() {});
}
List<GlobalKey<FlipCardState>> cardKeys = [];
@override
void initState() {
List.generate(52, (index) {
cardKeys.add(GlobalKey<FlipCardState>());
});
super.initState();
}
@override
Widget build(BuildContext context) {
print(cardKeys.length);
return new Scaffold(
body: new Column(children: <Widget>[
new Expanded(
child: GridView.count(
crossAxisCount: 5,
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: new FlipCard(
key: cardKeys[index],
direction: FlipDirection.HORIZONTAL,
speed: 1000,
onFlipDone: (status) {
setState(() {
(status) ? decreaseCounter() : increaseCounter();
});
if (widget.counter == 25) {
Fluttertoast.showToast(
msg: "You've got 25 states! Wow!",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM_LEFT,
timeInSecForIosWeb: 1,
backgroundColor: Colors.red,
textColor: Colors.white,
fontSize: 16.0);
}
;
print(widget.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(
'FRONT',
style: TextStyle(color: Colors.white),
)
//Theme.of(context).textTheme.headline
),
Text(
'',
),
],
),
),
back: Container(
decoration: BoxDecoration(
color: Color(0xFF006666),
borderRadius: BorderRadius.all(Radius.circular(8.0)),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[Text('BACK')],
),
),
),
);
})))
]),
);
}
}