create method

  1. @override
Widget create(
  1. DropDownWidgetData 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(
    DropDownWidgetData 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;

      final fakeSelectedChild =
      hasChildren ? EditWidget(model: data.children.first) : null;

      return Container(
        constraints: const BoxConstraints(minWidth: 120, minHeight: 40),
        padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
        decoration: BoxDecoration(
          border: Border.all(
            color: isActive ? Colors.blue : Colors.grey.shade400,
            width: isActive ? 3 : 1,
          ),
          borderRadius: BorderRadius.circular(6),
          color: isActive
              ? Colors.blue.shade50
              : Colors.grey.shade100.withOpacity(0.6),
        ),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            Expanded(
              child: fakeSelectedChild ??
                  Text(
                    isActive ? 'Drop option here' : 'Select an item',
                    style: TextStyle(
                      color: isActive
                          ? Colors.blue.shade700
                          : Colors.grey.shade600,
                      fontStyle: hasChildren
                          ? FontStyle.normal
                          : FontStyle.italic,
                    ),
                  ),
            ),
            const Icon(Icons.arrow_drop_down, color: Colors.grey),
          ],
        ),
      );
    },
  );
}