Flutter flatter如何在小部件之间交换焦点?

Flutter flatter如何在小部件之间交换焦点?,flutter,button,canvas,focus,transfer,Flutter,Button,Canvas,Focus,Transfer,我正在使用颤振开发一个平板电脑应用程序。我有一套按钮和一块画布。我想在一个按钮上执行拖动,当我离开按钮的边界后,我想开始在画布上绘制一个符号,并能够拖动它直到我释放我的触摸手势。到目前为止,我在按钮上插入了一个手势监听器,观察按钮上的相对水平移动,负阈值表示触摸已在按钮左侧退出,并开始在画布上移动。然而,手势监听器被按钮卡住了,我如何将焦点从按钮转移到画布上?下面是我的按钮代码: import 'package:flutter/material.dart'; import 'package:fl

我正在使用颤振开发一个平板电脑应用程序。我有一套按钮和一块画布。我想在一个按钮上执行拖动,当我离开按钮的边界后,我想开始在画布上绘制一个符号,并能够拖动它直到我释放我的触摸手势。到目前为止,我在按钮上插入了一个手势监听器,观察按钮上的相对水平移动,负阈值表示触摸已在按钮左侧退出,并开始在画布上移动。然而,手势监听器被按钮卡住了,我如何将焦点从按钮转移到画布上?下面是我的按钮代码:

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';

import './plan_display_page/plan_display_page.dart';
import './vars.dart' as vars;

// ignore: must_be_immutable
class DraggableMachineButton extends StatefulWidget {
  PlanDisplayPageState pdps;

  DraggableMachineButton(
    PlanDisplayPageState pdps,
  ) {
    this.pdps = pdps;
  }

  @override
  State<StatefulWidget> createState() => _DraggableMachineButtonState();
}

class _DraggableMachineButtonState extends State<DraggableMachineButton> {
  PlanDisplayPageState pdps;
  bool _buttonPressed = false;
  bool _loopActive = false;

  void _moveWhilePressed() async {
    // make sure that only one loop is active
    if (_loopActive) return;

    _loopActive = true;
    if (_buttonPressed) {
      print('DRAAGGGGG THE MACHINE');
      // do your thing
      setState(() {
        vars.machineDragging = true;
      });
      // wait a bit
      await Future.delayed(Duration(milliseconds: 100));
    }

    _loopActive = false;
  }

  @override
  void initState() {
    this.pdps = widget.pdps;
    super.initState();
  }

  //This is unnecessary
  @override
  void didUpdateWidget(DraggableMachineButton oldWidget) {
    super.didUpdateWidget(oldWidget);
  }

  @override
  Widget build(BuildContext context) {
    // return Focus(
    //   focusNode: null,
    return Listener(
      onPointerDown: (details) {
        _buttonPressed = true;
        _moveWhilePressed();
      },
      onPointerUp: (details) {
        _buttonPressed = false;
        _makeStopRequest();
      },
      onPointerCancel: (details) {
        print('cancel cancel cancel cancel');
      },
      onPointerSignal: (details) {
        print('SIGNAL ' + details.toString());
      },
      onPointerMove: (details) {
        // print('move move move ' + details.localPosition.toString());
        if (details.localPosition.dx < -10) {
          vars.startDraggingMachine = true;
          print('LOC ' + details.localPosition.toString());
          print('POS ' + details.position.toString());

          // globals.cct.canvasContainerTransformableStateBuilder.gt
          //     .onHorizontalDragStart(
          //         DragStartDetails(localPosition: details.localPosition));
          // print('xxxxxx');
          // globals.cct.canvasContainerTransformableStateBuilder.build(context);//
          // globals.cct.canvasContainerTransformableStateBuilder.onTapUp(details.localPosition);
          vars.novaCoord[0] = details.localPosition.dx;
          vars.novaCoord[1] = 0 - details.localPosition.dy;
          // _loopActive = false;
          // FocusScopeNode currentFocus = FocusScope.of(globals.cct.canvasContainerTransformableStateBuilder.context);
        }
      },
      child: Container(
        height: vars.buttonHeight * 1.4,
        width: vars.buttonWidth * 1.4,
        margin: EdgeInsets.only(
          right: vars.placeMachineTapped &&
                  (vars.distanceMeasurementStage < 0) &&
                  (!vars.isMachinePlaced())
              ? 0
              : 1200,
        ),
        child: FittedBox(
          fit: BoxFit.fill,
          child: FlatButton.icon(
            icon: Icon(
              MdiIcons.expansionCard,
              color: Colors.greenAccent,
              size: vars.tokenIconSize,
            ),
            shape: RoundedRectangleBorder(),
            color: Color.fromARGB(255, 70, 104, 132),
            splashColor: Colors.blueAccent,
            hoverColor: Colors.green,
            label: Text(
              'MACHINE',
              style: TextStyle(
                fontSize: 14.0,
                color: Colors.white,
              ),
              textAlign: TextAlign.center,
            ),
            //   ),
            // ),
            onPressed: () {
              if (!vars.crossingRefLinesExists) return;
//              vars.machinePositioned = true;
              vars.placeMachineTokenTapped = true;
            },
          ),
        ),
      ),
      // ),
    );
  }

  _makeStopRequest() async {
    // pdps.connect();
    print('STOP DRAGGING THE MACHINE');
    vars.machineDragging = false;
    // pdps.sendMessage('stop', false);
  }
}
导入“包装:颤振/材料.省道”;
导入“package:flatter/widgets.dart”;
导入“包装:材料\设计\图标\颤振/材料\设计\图标\颤振.dart”;
导入“./plan\u display\u page/plan\u display\u page.dart”;
将“/vars.dart”作为变量导入;
//忽略:必须是不可变的
类DragableMachineButton扩展StatefulWidget{
计划状态PDP;
可拖动机器按钮(
计划状态PDP,
) {
这是pdps=pdps;
}
@凌驾
State createState()=>_DraggableMachineButtonState();
}
类_DragableMachineButtonState扩展状态{
计划状态PDP;
bool\u按钮按下=错误;
bool _loopActive=false;
void\u moveWhilePressed()异步{
//确保只有一个循环处于活动状态
如果(_loopActive)返回;
_loopActive=true;
如果(_按钮按下){
打印(“拖动机器”);
//做你的事
设置状态(){
vars.machineDragging=true;
});
//稍等
等待未来。延迟(持续时间(毫秒:100));
}
_loopActive=false;
}
@凌驾
void initState(){
this.pdps=widget.pdps;
super.initState();
}
//这是不必要的
@凌驾
void didUpdateWidget(DragableMachineButton oldWidget){
super.didUpdateWidget(oldWidget);
}
@凌驾
小部件构建(构建上下文){
//返回焦点(
//focusNode:null,
返回侦听器(
onPointerDown:(详细信息){
_按钮按下=真;
_moveWhilePressed();
},
onPointerUp:(详细信息){
_按钮按下=错误;
_makeStopRequest();
},
onPointerCancel:(详细信息){
打印(“取消”);
},
onPointerSignal:(详细信息){
打印('SIGNAL'+details.toString());
},
onPointerMove:(详细信息){
//打印('move'+details.localPosition.toString());
如果(details.localPosition.dx<-10){
vars.startDragingMachine=真;
打印('LOC'+details.localPosition.toString());
打印('POS'+details.position.toString());
//globals.cct.canvasContainerTransformableStateBuilder.gt
//.onHorizontalDragStart(
//DragStartDetails(localPosition:details.localPosition));
//打印('xxxxxx');
//globals.cct.canvasContainerTransformableStateBuilder.build(上下文)//
//globals.cct.canvasContainerTransformableStateBuilder.onTapUp(details.localPosition);
vars.novaCoord[0]=details.localPosition.dx;
vars.novaCoord[1]=0-details.localPosition.dy;
//_loopActive=false;
//FocusScopeNode currentFocus=FocusScope.of(globals.cct.canvasContainerTransformableStateBuilder.context);
}
},
子:容器(
高度:可变钮扣高度*1.4,
宽度:可变按钮宽度*1.4,
页边距:仅限边距(
右:vars.placeMachineTaped&&
(可变距离测量阶段<0)&&
(!vars.isMachinePlaced())
? 0
: 1200,
),
孩子:FittedBox(
fit:BoxFit.fill,
子:FlatButton.icon(
图标:图标(
mdicons.expansionCard,
颜色:Colors.greenAccent,
大小:vars.tokenIconSize,
),
形状:RoundedRectangleBorder(),
颜色:颜色。来自argb(255,70,104,132),
splashColor:Colors.blueAccent,
hoverColor:Colors.green,
标签:文本(
"机器",,
样式:TextStyle(
字体大小:14.0,
颜色:颜色,白色,
),
textAlign:textAlign.center,
),
//   ),
// ),
已按下:(){
如果(!vars.crossingRefLinesExists)返回;
//vars.machinePositioned=真;
vars.placeMachineTokenTapped=真;
},
),
),
),
// ),
);
}
_makeStopRequest()异步{
//connect();
打印(“停止拖动机器”);
vars.machineDragging=false;
//pdps.sendMessage('stop',false);
}
}