create method

  1. @override
Widget create(
  1. RowWidgetData data,
  2. Environment environment,
  3. BuildContext context
)
override

create the widget given a WidgetData type data the widget data environment the current Environment context the BuildContext

Implementation

@override
Widget create(RowWidgetData data, Environment environment, BuildContext context) {
  return DragTarget<WidgetData>(
    onWillAccept: (widget) => data.acceptsChild(widget!),
    onAccept: (widget) {
      environment.get<CommandStack>().execute(
        ReparentCommand(
          bus: environment.get<MessageBus>(),
          widget: widget,
          newParent: data,
        ),
      );

      WidgetsBinding.instance.addPostFrameCallback((_) =>
          environment.get<MessageBus>().publish(
            "selection",
            SelectionEvent(selection: widget, source: this),
          ));
    },
    builder: (context, candidateData, rejectedData) {
      final isActive = candidateData.isNotEmpty;
      final hasChildren = data.children.isNotEmpty;

      return Container(
        constraints: const BoxConstraints(
          minWidth: 100,
          minHeight: 60,
        ),
        padding: const EdgeInsets.all(12),
        decoration: BoxDecoration(
          border: Border.all(
            color: isActive ? Colors.blue : Colors.grey.shade400,
            width: isActive ? 3 : 1,
            style: hasChildren ? BorderStyle.solid : BorderStyle.solid,
          ),
          color: isActive
              ? Colors.blue.shade50
              : (hasChildren ? Colors.transparent : Colors.grey.shade50),
        ),
        child: hasChildren
            ? Row(
          mainAxisAlignment: data.mainAxisAlignment ?? MainAxisAlignment.start,
          crossAxisAlignment: data.crossAxisAlignment ?? CrossAxisAlignment.center,
          mainAxisSize: data.mainAxisSize ??  MainAxisSize.max,
          children: [
            for (int i = 0; i < data.children.length; i++) ...[
              EditWidget(model: data.children[i]),
              // Add spacing between children except for the last one
              if (i < data.children.length - 1)
                const SizedBox(height: 8),
            ],
          ],
        )
            : Center(
          child: Text(
            isActive ? 'Drop widgets here' : 'Empty Container',
            textAlign: TextAlign.center,
            style: TextStyle(
              color: isActive ? Colors.blue.shade600 : Colors.grey.shade600,
              fontSize: 12,
              fontStyle: FontStyle.italic,
            ),
          ),
        ),
      );
    },
  );
}