registerItemTemplate method

void registerItemTemplate(
  1. BuildContext context,
  2. BaseItemTemplate itemTemplate, {
  3. 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);
      // }
    }
  }
}