Flutter Adaptive Template

A template engine for adaptive cards, enabling data binding and dynamic rendering of adaptive card payloads in Flutter available on GitHub flutter_adaptive_template_fs and on pub.dev that is expected to be used with pub.dev on GitHub at flutter_adaptive_cards_fs .

Microsoft Adaptive Cards

This project is in no way associated with Microsoft. It is an open source project to create an adaptive card implementation for Flutter.

Flutter-AdaptiveCards mono repo

Libraries avaiable on pub.dev from this repository include:

Package / Library pub.dev
The core of Adaptive Cards is supported via flutter_adaptive_cards_fs
Supplemental Adaptive Card based charts are supported via flutter_adaptive_charts_fs
Templating is supported via the flutter_adaptive_template_fs
Backend invoke bridge is supported via flutter_adaptive_cards_host_fs

Utility programs available in this repository that are not published to pub.dev include:

Design time utility Location
The Adaptive Card Explorer Editor (adaptive_explorer)
A Widgetbook for demonstrating cards and their features: (widgetbook)

Package structure

Standalone templating — no dependency on flutter_adaptive_cards_fs. Output is expanded card JSON for the renderer.

flowchart LR
  subgraph template_pkg["flutter_adaptive_template_fs"]
    ACT["AdaptiveCardTemplate\npublic API"]
    EV["Evaluator\nscopes · data binding · when · iteration"]
    RES["Resolver"]
    AST["ast.dart"]
    EP["ExpressionParser\nproperty bindings · functions"]
    ACT --> EV
    EP --> EV
    EV --> RES
    RES --> AST
  end

  TPL["Template JSON"] --> ACT
  DATA["Data JSON"] --> ACT
  ACT --> OUT["Expanded JSON string"]
  OUT -->|"jsonDecode → RawAdaptiveCard"| CORE["flutter_adaptive_cards_fs\noptional next step"]

Design detail: adaptive-template-design.md.

Usage

You can use the AdaptiveCardTemplate to expand a JSON-based template with a data Map.

import 'dart:convert';
import 'package:flutter_adaptive_template_fs/flutter_adaptive_template_fs.dart';

void main() {
  // 1. Define your template (usually loaded from a file or asset using jsonDecode)
  final templateJson = {
    'type': 'TextBlock',
    'text': r'Hello, ${name}!'
  };

  // 2. Define your data (usually loaded from an API or local file)
  final data = {
    'name': 'Matt'
  };

  // 3. Create the template instance
  final template = AdaptiveCardTemplate(templateJson);

  // 4. Expand the template with the provided data
  final String mergedPayload = template.expand(data);

  // The output is a JSON string with the expanded placeholders
  print(mergedPayload); // {"type":"TextBlock","text":"Hello, Matt!"}
}

Status: MVP Implemented

Current implementation supports:

  • Basic property binding ${prop}
  • Deep property binding ${path.to.prop}
  • Array indexing ${map[0].prop}
  • Scope switching with $data
  • Iteration with $data (applied to lists)
  • Conditional rendering with $when
  • Built-in expressions (e.g., if(), json())
  • Magic variables: $root, $index

Additional information

This package is part of the Flutter-AdaptiveCards ecosystem.

For more information, please visit the Main GitHub Repository. There you can find details about how this package integrates with the core library, how to contribute, and how to file issues.

Demonstration

The Adaptive Card Explorer Editor demonstrates the use of templates.

Libraries

flutter_adaptive_template_fs
Adaptive Card templating — expand $data-bound templates into card JSON for rendering.