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