Flutter 颤振-处理多个坠落目标?

Flutter 颤振-处理多个坠落目标?,flutter,Flutter,所以,我想展示一个简单的tic-tac趾板。 我的问题是只有第一个Position()响应图像返回。 我该怎么做? 我只是希望封装掉目标位置() 主要的一点是多个droptargets()positioned()Stack(),让它们全部响应,而不是只响应最上面的一个 import 'package:flutter/material.dart'; class PvpScreen extends StatefulWidget { static const routeName = '/pvpS

所以,我想展示一个简单的tic-tac趾板。 我的问题是只有第一个Position()响应图像返回。 我该怎么做? 我只是希望封装掉目标位置()

主要的一点是多个droptargets()positioned()Stack(),让它们全部响应,而不是只响应最上面的一个

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');
}
},
),
);
}
}