title: flutter dynamic expansionTile
body: <p>Looking for some guidance on building expansionTile list dynamically.  I have a successful Listview built dynamically from json API, but can not find any examples on building the expansionTile.  I have 1 api call that brings back the top level and another call for each top level to bring back the expansion list.  Anyone have an example of this?  I have found the static example but is not clear how to how to make it dynamic.</p>
  
  <p>Here is some code I came up with.  I can see the Tile title portion and can see the json come in for the tile body, but can not figure out how to get the correct name of the list title in the body, nothing I try to set it to works.  Any ideas?</p>
  
  <pre><code>import 'dart:async';
  import 'package:intl/intl.dart';
  
  import 'package:flutter/material.dart';
  import 'package:flutter/services.dart';
  //import 'package:shared_preferences/shared_preferences.dart';
  import 'package:http/http.dart' as http;
  //import 'package:cswauthapp/models.dart';
  import 'package:flutter/foundation.dart';
  import 'dart:convert';
  
  var jsonCodec = const JsonCodec();
  List&lt;Exp&gt; myReasonList;
  List myDCList;
  int mycount = 0;
  
  void main() {
    runApp(new MyApp());
  
  }
  
  
  
  class MyApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
      return new MaterialApp(
        title: 'ExpansionTile Test',
        home: new MyHomePage(),
      );
    }
  }
  
  class MyHomePage extends StatefulWidget {
    @override
    _MyHomePageState createState() =&gt; new _MyHomePageState();
  }
  
  class _MyHomePageState extends State&lt;MyHomePage&gt; {
  
    @override
    void initState() {
      super.initState();
  
      _getData();
      //_getSpecialty();
    }
  
    _getData() async {
      var _url = 'http://$baseurl:8080/support/dc/1';
  
      var http = createHttpClient();
      var response = await http.get(_url);
  
      var dc = await jsonCodec.decode(response.body);
      myDCList = await dc.toList();
  
  
  
      print('DC: '+myDCList.toString());
  
      if (mounted) {
        setState(() {
          //_dataReceived = true;
          mycount = myDCList.length;
        });
      }
  
    }
  
    Future _getChildren(int did) async {
  
      var _url2 = 'http://174.138.61.246:8080/support/dcreasons/$did';
      var http = createHttpClient();
      var response = await http.get(_url2);
      var reasons = await jsonCodec.decode(response.body);
      myReasonList = await reasons.toList();
      print('REASONS: '+ myReasonList.toString());
  
  
      return myReasonList;
    }
  
    @override
    Widget build(BuildContext context) {
      return new Scaffold(
        appBar: new AppBar(
          title: new Text('ExpansionTile Test'),
        ),
        body: new ListView.builder(
          itemBuilder: _itemBuilder,
          itemCount: mycount,
        ),
      );
    }
  
    Widget _itemBuilder(BuildContext context, int index) {
      Exp exp = getExp(index);
      return new ListChild(exp: exp,);
    }
  
    Exp getExp(int index) {
      return new Exp(
        myDCList[index]['dname'],
        _getChildren(myDCList[index]['did']),
      );
      //return new Specialties.fromMap(mylist[index]);
  
    }
  }
  
  class Exp {
    Exp(this.title, [this.children]);
    final String title;
    final Future&lt;List&lt;Exp&gt;&gt; children;
  }
  
  
  class ListChild extends StatefulWidget {
    ListChild({Key key, this.exp}) : super(key: key);
  
    final Exp exp;
    @override
    State createState() =&gt; new ListChildState();
  }
  
  class ListChildState extends State&lt;ListChild&gt; {
    //PageStorageKey&lt;ListChildState&gt; _key = new PageStorageKey(ListChild);
    @override
    Widget build(BuildContext context) {
      return new ExpansionTile(
        key: new PageStorageKey(ListChild),
        title: new Text(widget.exp.title),
        children: &lt;Widget&gt;[
          new Text(widget.exp.children.title),
        ],
      );
    }
  }
  </code></pre>