如何删除小部件的实例

问题描述 投票:0回答:1

我正在创建一个编辑器,并使用 stack_board 库在其中包含多个小部件,如果未选择小部件,我想停止移动手势,这里是代码

`类 _ItemCaseState 使用 SafeState 扩展 State {

bool isWidgetSelected = false; 无效_onTap(){

if (widget.tapToEdit) {
  if (_operatState != OperatState.editing) {
    _operatState = OperatState.editing;
    safeSetState(() {});
  }
} else if (_operatState == OperatState.complate) {
  safeSetState(() {
    _operatState = OperatState.idle;
    isWidgetSelected = true;
  });
}

widget.onTap?.call();

widget.onOperatStateChanged?.call(_operatState);

}

void _moveHandle(DragUpdateDetails 无效){

if (!isWidgetSelected) {
  return;
}

if (_operatState != OperatState.moving) {
  if (_operatState == OperatState.scaling ||
      _operatState == OperatState.roating) {
    _operatState = OperatState.moving;
  } else {
    _operatState = OperatState.moving;
     safeSetState(() {});
  }

  widget.onOperatStateChanged?.call(_operatState);
}

} }`

我选择了一个变量小部件,我已使其在点击时变为真,并在移动手势上返回流程

但是在这种情况下,如果我选择一个小部件,它工作正常,然后选择另一个小部件,那么它的值对于第一个小部件仍然为真,我需要为第一个小部件设置值,仅使其对于选定的小部件为真

我尝试对所有元素使用 for 循环也不起作用

editorController.stackboardIdsList.forEach((itemId) { isWidgetSelected = false; });

flutter dart
1个回答
0
投票
class _ItemCaseState extends State with SafeState {
    String? selectedWidgetId; // To store the ID of the selected widget

    void _onTap(String widgetId) {
        if (widget.tapToEdit) {
            if (_operatState != OperatState.editing) {
                _operatState = OperatState.editing;
                safeSetState(() {});
            }
        } else if (_operatState == OperatState.complate) {
            safeSetState(() {
                _operatState = OperatState.idle;
                selectedWidgetId = widgetId; // Update selected widget ID
            });
        }

        widget.onTap?.call();
        widget.onOperatStateChanged?.call(_operatState);
    }

    void _moveHandle(DragUpdateDetails dud, String widgetId) {
        if (selectedWidgetId != widgetId) {
            return; // Skip move if this widget is not selected
        }

        if (_operatState != OperatState.moving) {
            if (_operatState == OperatState.scaling || _operatState == OperatState.roating) {
                _operatState = OperatState.moving;
            } else {
                _operatState = OperatState.moving;
                safeSetState(() {});
            }

            widget.onOperatStateChanged?.call(_operatState);
        }
    }
}


What I Did:
Managed Widget Selection: Introduced a selectedWidgetId variable to track which widget is currently selected, ensuring that only one widget can be interacted with at a time.

Updated Selection on Tap: Modified the _onTap method to update the selected widget’s ID when the widget is tapped, setting it as the currently selected widget.

Handled Movement Control: Updated the _moveHandle method to ensure that the drag movement applies only to the widget that is currently selected, skipping any unselected widgets.

State Management: Utilized safeSetState() to ensure the UI is updated properly when a widget is selected or moved.

This approach ensures that only the active widget can be moved or interacted with, while all other widgets are properly deselected, solving the issue of multiple widgets being selected simultaneously.
© www.soinside.com 2019 - 2024. All rights reserved.