简体   繁体   English

Flutter 未调用 DragTarget onAccept

[英]Flutter DragTarget onAccept is not being called

I am developing a feature where the user enters a sentence, in the next screen the words of that sentence get shuffled randomly, then the user has to drag the words to a drag target to form the original sentence.我正在开发一项功能,用户输入一个句子,在下一个屏幕中,该句子的单词会随机打乱,然后用户必须将这些单词拖动到拖动目标以形成原始句子。

You can get an idea from the screenshots below.你可以从下面的截图中得到一个想法。

First screen第一屏

在此处输入图像描述

Second screen第二屏

在此处输入图像描述

Now the problem I am having is, when dragging the words to the target I can see the DragTarget is calling onWillAccept as I added a print() statement there, if it is doing so then it should call onAccept eventually but it is not doing so.现在我遇到的问题是,当将单词拖到目标时,我可以看到DragTarget正在调用onWillAccept ,因为我在那里添加了一个print()语句,如果它这样做,那么它最终应该调用onAccept但它没有这样做. This is why my codes that deal with Bloc are not getting called and the words are not showing up in the target spot.这就是为什么我处理Bloc的代码没有被调用并且这些词没有出现在目标位置的原因。

Code代码

class SentenceMakeScreen extends StatefulWidget {
  String inputSentence;

  SentenceMakeScreen(this.inputSentence);

  @override
  State<SentenceMakeScreen> createState() => _SentenceMakeScreenState();
}

class _SentenceMakeScreenState extends State<SentenceMakeScreen> {
  List<String> sentence = [];

  List<Widget> wordWidgets = [];
  
  bool isDragSuccessful = false;

  final ButtonStyle _buttonStyle = ElevatedButton.styleFrom(
      textStyle: TextStyle(fontSize: 20)
  );

  _getTextWidgets(List<String> sentence) {
    for(var i = 0; i < sentence.length; i++){
      wordWidgets.add(
        Draggable<WordWidget>(
         data: WordWidget(sentence[i]),
         child: WordWidget(sentence[i]),
         feedback: WordWidget(sentence[i]),
          childWhenDragging: Container(),
        )
      );
    }
  }

  _randomlyOrganizeSentence(String inputString) {
    sentence = inputString.split(new RegExp(r" "));
    sentence.shuffle();
    print(sentence);
  }

  @override
  void initState() {
    // TODO: implement initState
    _randomlyOrganizeSentence(widget.inputSentence);
    _getTextWidgets(sentence);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final _dragDropBloc = DragDropBloc();

    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
      body: Container(
        alignment: Alignment.center,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: [
            DragTarget<WordWidget>(
              builder: (context, data, rejectedData) {
                return Center(
                  child: this.isDragSuccessful
                      ?
                  Container(
                    width: double.maxFinite,
                    margin: EdgeInsets.all(10),
                    decoration: BoxDecoration(
                      color: Colors.white,
                      border: Border(
                        bottom: BorderSide(width: 1.0, color: Colors.black),
                      ),
                    ),
                    child: StreamBuilder<List<WordWidget>>(
                      stream: _dragDropBloc.widgetStream,
                      initialData: [],
                      builder: (BuildContext context, AsyncSnapshot<List<WordWidget>> snapshot) {
                        print("Here ${snapshot.data}");
                        return Wrap(
                          direction: Axis.horizontal,
                          children: [
                            //correctly ordered words
                          ],
                        );
                      },
                    ),
                  )
                  :
                  Container(
                    width: double.maxFinite,
                    margin: EdgeInsets.all(10),
                    decoration: BoxDecoration(
                      color: Colors.white,
                      border: Border(
                        bottom: BorderSide(width: 1.0, color: Colors.black),
                      ),
                    ),
                    child: Text("Drag here")
                  ),
                );
              },
              onWillAccept: (data) {
                print("true");
                return true;
              },
              onAccept: (data) {
                print(data.toString());
                _dragDropBloc.dragDropEventSink.add(
                    DropEvent(WordWidget(data.toString()))
                );
                setState(() {
                  this.isDragSuccessful = true;
                  //draggedWords.add(data.toString());
                });
              },
            ),
            Wrap(
              direction: Axis.horizontal,
              children: wordWidgets
            ),
            Container(
              child: ElevatedButton(
                style: _buttonStyle,
                onPressed: () {

                },
                child: Text("Check"),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

WordWidget WordWidget

import 'package:flutter/material.dart';

class WordWidget extends StatelessWidget {
  final String word;
  const WordWidget(this.word);

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.all(10),
      decoration: BoxDecoration(
        color: Colors.red[900],
        border: Border.all(
            width: 4,
            color: Colors.black
        ),
        borderRadius: BorderRadius.circular(10),
      ),
      child: Padding(
          padding: EdgeInsets.all(5),
          child: Text(
            word,
            style: TextStyle(
                color: Colors.white
            ),
          )
      ),
    );
  }
}

I tried adding the type of data I am passing from Draggable to DragTarget , this is what was advised here .我尝试添加我从Draggable传递到DragTargetdata类型,这是这里建议的。 It did not work.那没起效。

I was also getting the same error earlier today.我今天早些时候也遇到了同样的错误。 I then upgraded my flutter to the latest version and wrote the DragTarget code again from scratch.然后我将我的 flutter 升级到最新版本并从头开始重新编写 DragTarget 代码。 I don't know what worked for me but you can try doing the same.我不知道什么对我有用,但你可以尝试做同样的事情。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM