bindValue method

  1. @override
dynamic bindValue(
  1. String exp
)
override

Implementation

@override
dynamic bindValue(String exp) {
  if (currentMatch(exp)) {
    if (exp == 'item') {
      return source?[index];
    } else if (exp == 'index') {
      return index;
    }
    // Carrying ”#(“ indicates value conversion to a string
    final isStringValue = exp.startsWith('#(');
    dynamic processed = exp.substring(2, exp.length - 1);
    if (processed.startsWith('\${')) {
      processed = processed.substring(2, processed.length - 1);
    }

    // ^(item)
    if (processed == 'item') {
      return source?[index];
    }
    // ^(index)
    else if (processed == 'index') {
      return index;
    }

    if (processed.contains('.')) {
      List<String> expList = processed.split('.');
      if (expList.first == '\$item' || expList.first == 'item') {
        dynamic obj = source?[index];
        dynamic modelValue;
        if (obj is BaseModel) {
          var json = (obj).toJson();
          modelValue = json;
        } else if (obj is Map) {
          modelValue = obj;
        }
        if (modelValue != null) {
          expList.removeAt(0);
          for (var k in expList) {
            modelValue = modelValue[k];
          }
          // If conversion to a string is not explicitly indicated, the original type is returned
          processed = isStringValue ? '$modelValue' : modelValue;
        }
      }
    } else {
      processed = processed.replaceAll('\$item', '${source?[index]}');
      processed = processed.replaceAll('\$index', '$index');
    }

    return processed;
  } else if (parentMatch(exp)) {
    return parent!.bindValue(exp);
  }
  return exp;
}