Flutter 颤振-处理多个坠落目标?
所以,我想展示一个简单的tic-tac趾板。 我的问题是只有第一个Position()响应图像返回。 我该怎么做? 我只是希望封装掉目标位置() 主要的一点是多个droptargets()positioned()Stack(),让它们全部响应,而不是只响应最上面的一个Flutter 颤振-处理多个坠落目标?,flutter,Flutter,所以,我想展示一个简单的tic-tac趾板。 我的问题是只有第一个Position()响应图像返回。 我该怎么做? 我只是希望封装掉目标位置() 主要的一点是多个droptargets()positioned()Stack(),让它们全部响应,而不是只响应最上面的一个 import 'package:flutter/material.dart'; class PvpScreen extends StatefulWidget { static const routeName = '/pvpS
import 'package:flutter/material.dart';
class PvpScreen extends StatefulWidget {
static const routeName = '/pvpScreen';
@override
State<StatefulWidget> createState() {
return _PvpScreenState();
}
}
class _PvpScreenState extends State<PvpScreen> {
_Controller con;
bool successfulDrop;
bool dropX;
bool dropO;
@override
void initState() {
super.initState();
con = _Controller(this);
}
void render(fn) => setState(fn);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.purple[400],
title: Center(child: Text('Tic Tac Toe PVP')),
),
backgroundColor: Colors.black,
body: Stack(
children: <Widget>[
Positioned(
top: 10.0,
left: 135.0,
child: Text(
'Tic Tac Toe',
style: TextStyle(color: Colors.purple, fontSize: 30.0),
),
),
Positioned(
top: 60.0,
left: 60.0,
child: Image.asset(
'images/3x3.png',
height: 300,
fit: BoxFit.fitWidth,
),
),
// Positioned Grid of Drop Zones
//DropZone Top Right
Positioned(top: 62.0, left: 260.0, child: con.dropTargetTemplate()),
//DropZone Top Left
Positioned(
top: 62.0,
left: 62.0,
child: con.dropTargetTemplate(),
),
//Displaying User's X
Positioned(
top: 400.0,
left: 60.0,
child: Draggable(
child: con.displayingXs(),
childWhenDragging: Container(),
feedback: con.displayingXs(),
data: 'X',
),
),
//Displaying User's O
Positioned(
top: 400.0,
left: 280.0,
child: Draggable(
child: con.displayingOs(),
childWhenDragging: Container(),
feedback: con.displayingOs(),
data: 'O',
),
),
],
),
);
}
}
class _Controller {
_PvpScreenState _state;
_Controller(this._state);
void dropppingXs() {
_state.render(() {
_state.successfulDrop = true;
_state.dropX = true;
_state.dropO = false;
});
}
void droppingOs() {
_state.render(() {
_state.successfulDrop = true;
_state.dropO = true;
_state.dropX = false;
});
}
Widget displayingXs() {
return Image.asset(
'images/NeonRedX.png',
height: 100,
fit: BoxFit.fitWidth,
);
}
Widget displayingOs() {
return Image.asset(
'images/NeonBlueO.jpg',
height: 100,
fit: BoxFit.fitWidth,
);
}
Widget dropTargetTemplate() {
return Container(
height: 98.0,
width: 98.0,
color: Colors.blue,
child: DragTarget<String>(
builder: (context, List<String> incoming, List rejected) {
if (_state.successfulDrop == true && _state.dropX == true) {
_state.successfulDrop = false;
return _state.con.displayingXs();
} else if (_state.successfulDrop == true && _state.dropO == true) {
_state.successfulDrop = false;
return _state.con.displayingOs();
} else {
return null;
}
},
onWillAccept: (data) => data == 'X' || data == 'O',
onAccept: (data) {
if (data == 'X') {
_state.con.dropppingXs();
} else if (data == 'O') {
_state.con.droppingOs();
} else {
print('DropError');
}
},
),
);
}
}
导入“包装:颤振/材料.省道”;
类PvpScreen扩展了StatefulWidget{
静态常量routeName='/pvpScreen';
@凌驾
状态createState(){
返回_pvpscrenstate();
}
}
类_PvpScreenState扩展状态{
_控制器con;
布尔成功滴;
bool-dropX;
布尔-德波;
@凌驾
void initState(){
super.initState();
con=_控制器(此);
}
无效渲染(fn)=>设置状态(fn);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
背景颜色:颜色.紫色[400],
标题:中心(子项:文本(“Tic Tac Toe PVP”),
),
背景颜色:Colors.black,
主体:堆栈(
儿童:[
定位(
排名:10.0,
左:135.0,
子:文本(
"Tic Tac Toe",,
样式:TextStyle(颜色:Colors.purple,fontSize:30.0),
),
),
定位(
排名:60.0,
左:60.0,
子:Image.asset(
“images/3x3.png”,
身高:300,
适合:BoxFit.fitWidth,
),
),
//放置区域的定位网格
//右上角的DropZone
已定位(顶部:62.0,左侧:260.0,子项:con.dropTargetTemplate()),
//左上角的DropZone
定位(
排名:62.0,
左:62.0,
子项:con.dropTargetTemplate(),
),
//显示用户的X
定位(
top:400.0,
左:60.0,
孩子:拖拉(
子项:con.displayingXs(),
ChildWhenDraging:容器(),
反馈:con.displayingXs(),
数据:'X',
),
),
//显示用户的O
定位(
top:400.0,
左:280.0,
孩子:拖拉(
子项:con.displayingOs(),
ChildWhenDraging:容器(),
反馈:con.displayingOs(),
数据:'O',
),
),
],
),
);
}
}
类控制器{
_PvpScreenState_状态;
_控制器(此状态);
void dropppingXs(){
_state.render(){
_state.successfulDrop=true;
_state.dropX=true;
_state.dropO=false;
});
}
void-droppingOs(){
_state.render(){
_state.successfulDrop=true;
_state.dropO=true;
_state.dropX=false;
});
}
小部件显示xs(){
返回Image.asset(
“images/NeonRedX.png”,
身高:100,
适合:BoxFit.fitWidth,
);
}
Widget displayingOs(){
返回Image.asset(
'images/NeonBlueO.jpg',
身高:100,
适合:BoxFit.fitWidth,
);
}
小部件dropTargetTemplate(){
返回容器(
身高:98.0,
宽度:98.0,
颜色:颜色,蓝色,
儿童:DragTarget(
生成器:(上下文、列表传入、列表拒绝){
if(_state.successfulDrop==true&&u state.dropX==true){
_state.successfulDrop=false;
返回_state.con.displayingXs();
}else if(_state.successfulDrop==true&&u state.dropO==true){
_state.successfulDrop=false;
返回_state.con.displayingOs();
}否则{
返回null;
}
},
onWillAccept:(data)=>data='X'| | data='O',
onAccept:(数据){
如果(数据='X'){
_state.con.dropppingXs();
}else if(数据='O'){
_state.con.droppingOs();
}否则{
打印('DropError');
}
},
),
);
}
}