create method
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,
),
),
),
);
},
);
}