registerItemTemplate method
void
registerItemTemplate(
- BuildContext context,
- BaseItemTemplate itemTemplate, {
- required Function onDataChanged,
Implementation
void registerItemTemplate(BuildContext context, BaseItemTemplate itemTemplate,
{required Function onDataChanged}) {
ScopeManager? scopeManager = DataScopeWidget.getScope(context);
if (scopeManager != null) {
DataExpression? dataExpression =
DataUtils.parseDataExpression(itemTemplate.data);
if (dataExpression != null) {
// listen to the binding from our itemTemplate
// data: $(apiName.*)
scopeManager.listen(scopeManager, dataExpression.rawExpression,
destination: (widget is EnsembleWidget)
? BindingDestination(
(widget as EnsembleWidget).controller, 'itemTemplate')
: BindingDestination(widget as Invokable, 'itemTemplate'),
onDataChange: (ModelChangeEvent event) {
// Optimization - we don't care if API status is in loading state
if (event.source is APIBindingSource &&
event.payload is APIResponse &&
event.payload.isLoading()) {
return;
}
// evaluate the expression
dynamic dataList = scopeManager.dataContext.eval(itemTemplate.data);
if (dataList is List) {
onDataChanged(dataList);
}
});
}
// evaluate the data list now and dispatch it as a data change
dynamic dataList = scopeManager.dataContext.eval(itemTemplate.data);
if (dataList is List) {
onDataChanged(dataList);
} else {
// TODO: evaluate the initial values here? No use case yet
// dynamic initialValue =
// scopeManager.dataContext.eval(itemTemplate.initialValue);
// if (initialValue is List) {
// onDataChanged(initialValue);
// }
}
}
}