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