DragTarget onWillAccept и onAccept не запускаются - PullRequest
0 голосов
/ 03 декабря 2018

Я начинаю с Flutter и не могу заставить работать функцию перетаскивания.Я следовал за документацией, но понятия не имею, что я делаю неправильно.В этом примере приложения отображаются три квадрата, а синий можно перетаскивать.Другие имеют DragTarget, один внутри квадрата и один вне квадрата.Когда я перетаскиваю синий квадрат, он печатает информацию о том, что перетаскивание началось, но при перетаскивании или перетаскивании мышью над объектами DragTargets информация отсутствует.Вот код:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.red,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Container(
          constraints: BoxConstraints.expand(),
          color: Colors.grey[900],
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: <Widget>[
              Container(
                width: 100,
                height: 100,
                color: Colors.red,
                child: DragTarget(
                  onWillAccept: (d) => true,
                  onAccept: (d) => print("ACCEPT 1!"),
                  onLeave: (d) => print("LEAVE 1!"),
                  builder: (a,data,c) {
                    print(data);
                    return Center();
                  },
                ),
              ),
              DragTarget(
                onWillAccept: (d){return true;},
                onAccept:(d) => print("ACCEPT 2!"),
                onLeave: (d) => print("LEAVE 2!"),
                builder: (context, candidateData, rejectedData){
                  return Container(
                    width: 150,
                    height: 150,
                    color: Colors.purple
                  );
                }
              ),
              Draggable(
                data: ["SOME DATA"],
                onDragStarted: () => print("DRAG START!"),
                onDragCompleted: () => print("DRAG COMPLETED!"),
                onDragEnd: (details) => print("DRAG ENDED!"),
                onDraggableCanceled: (data, data2) => print("DRAG CANCELLED!"),
                feedback: SizedBox(
                  width: 100,
                  height: 100,
                  child: Container(
                    margin: EdgeInsets.all(10),
                    color: Colors.green[800],
                  ),
                ),
                child: SizedBox(
                  width: 100,
                  height: 100,
                  child: Container(
                    margin: EdgeInsets.all(10),
                    color: Colors.blue[800],
                  ),
                ),
              ),
            ],
          )
        ),
      )
    );
  }
}

Ответы [ 2 ]

0 голосов
/ 15 августа 2019

Вам следует установить setState при вызове onAccept и добавить логическое значение в виджет с состоянием.

bool принят = false;

onAccept: (data){
      if(data=='d'){
        setState(() {
          accepted = true;
        });
      },
0 голосов
/ 04 декабря 2018

Очевидно, что Draggable и DragTarget должны иметь общий тип, указанный при передаче данных, в противном случае onAccept и onWillAccept не будут запущены.

Например, если вы хотите передать данные как int, тогда используйтеDraggable<int> и DragTarget<int> - это также относится к onAccept и onWillAccept, они должны принимать int в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...