微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FLUTTER - DRAGGABLE & DRAG TARGET - 如何处理“on will accept”和“on accept”参数

如何解决FLUTTER - DRAGGABLE & DRAG TARGET - 如何处理“on will accept”和“on accept”参数

我正在构建一个小型 ANAGRAM 游戏,以学习如何使用 Flutter 中的“拖放”功能

我已经设法编写了一些代码,但是由于某种原因,拖动目标中似乎从未接受拖动的“字母”....我可能以错误的方式使用了“on will accept”参数。

代码如下:

class Anagram extends StatefulWidget {
  static const String id = 'anagram';
  final String? word;
  Anagram({@required this.word});

  @override
  _AnagramState createState() => _AnagramState();
}

class _AnagramState extends State<Anagram> {

  @override
  Widget build(BuildContext context) {
    List letters = widget.word!.split("");
    letters.shuffle();
    print(letters);
    return Scaffold(
      backgroundColor: Colors.indigo[900],appBar: AppBar(
        backgroundColor: Colors.white,elevation: 0,automaticallyImplyLeading: false,leading: IconButton(
            icon: Icon(Icons.arrow_back_ios_rounded,color: Colors.red[400],size: 25.0),onpressed: () {
              Navigator.pop(context);
            }),title: Center(
          child: Text(
            'ANAGRAMS',style: TextStyle(color: Colors.indigo[900],fontSize: 20),),actions: [
          Container(
            margin: const EdgeInsets.only(right: 10),child: Icon(Icons.memory,size: 45,color: Colors.red[900]),],body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceAround,children: [
          Row(mainAxisAlignment: MainAxisAlignment.center,children: [
            ...letters.map((e) {
              return TargetBox(letter: e);
            }),]),Row(mainAxisAlignment: MainAxisAlignment.center,children: [
            ...letters.map((e) => DragBox(letter: e)),);
  }
}

class DragBox extends StatelessWidget {
  const DragBox({
    required this.letter,});

  final String letter;

  @override
  Widget build(BuildContext context) {
    return Draggable<String>(
      Feedback: LetterBox(letter: letter),child: LetterBox(letter: letter),childWhenDragging: LetterBox(letter: ' '),);
  }
}

class TargetBox extends StatelessWidget {
  const TargetBox({
    required this.letter,});

  final String letter;

  @override
  Widget build(BuildContext context) {
    return DragTarget<String>(
        builder: (context,candidateData,rejectedData) {
          return LetterBox(letter: ' ');
        },onWillAccept: (data) => data == letter,onAccept: (data) {
          print('Je suis la');
          print(data);
          print(letter);
        },onLeave: (data) {
          print('Voici data : $data');
          print('Je suis parti');
          print('Voici Letter : $letter');
        });
  }
}

class LetterBox extends StatelessWidget {
  const LetterBox({
    required this.letter,});

  final String letter;

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 40,width: 40,margin: const EdgeInsets.all(5),padding: const EdgeInsets.all(4),decoration: Boxdecoration(
          color: Colors.white,borderRadius: BorderRadius.all(
            Radius.circular(10),border: Border.all(
            width: 1,color: Colors.indigo[900]!,)),child: Center(
        child: Text(
          letter.toupperCase(),style: TextStyle(
            color: Colors.red[900],fontSize: 18,);
  }
}

我也尝试过这些更改:但同样的问题:数据始终为空:

class TargetBox extends StatelessWidget {
  const TargetBox({
    required this.letter,});

  final String letter;

  @override
  Widget build(BuildContext context) {
    return DragTarget<DragBox>(
        builder: (context,onWillAccept: (data) => data == DragBox(letter: letter),onLeave: (data) {
          print('Voici data : $data');
          print('Je suis parti');
          print('Voici Letter : $letter');
        });
  }
}

解决方法

我找到了问题的答案:我忘记在 DRAGGABLE 对象中指定 DATA 字段...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。