flutter dynamic expansionTile
Reacting to you comment and edit of the question I took the liberty to write a working example. Feel free to edit or comment. I hope, this is what you wanted to achieve.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | import 'dart:async'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; 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() => new _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { Future<http.Response> _responseFuture; @override void initState() { super.initState(); _responseFuture = http.get('http://174.138.61.246:8080/support/dc/1'); } @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text('ExpansionTile Test'), ), body: new FutureBuilder( future: _responseFuture, builder: (BuildContext context, AsyncSnapshot<http.Response> response) { if (!response.hasData) { return const Center( child: const Text('Loading...'), ); } else if (response.data.statusCode != 200) { return const Center( child: const Text('Error loading data'), ); } else { List<dynamic> json = JSON.decode(response.data.body); return new MyExpansionTileList(json); } }, ), ); } } class MyExpansionTileList extends StatelessWidget { final List<dynamic> elementList; MyExpansionTileList(this.elementList); List<Widget> _getChildren() { List<Widget> children = []; elementList.forEach((element) { children.add( new MyExpansionTile(element['did'], element['dname']), ); }); return children; } @override Widget build(BuildContext context) { return new ListView( children: _getChildren(), ); } } class MyExpansionTile extends StatefulWidget { final int did; final String name; MyExpansionTile(this.did, this.name); @override State createState() => new MyExpansionTileState(); } class MyExpansionTileState extends State<MyExpansionTile> { PageStorageKey _key; Future<http.Response> _responseFuture; @override void initState() { super.initState(); _responseFuture = http.get('http://174.138.61.246:8080/support/dcreasons/${widget.did}'); } @override Widget build(BuildContext context) { _key = new PageStorageKey('${widget.did}'); return new ExpansionTile( key: _key, title: new Text(widget.name), children: <Widget>[ new FutureBuilder( future: _responseFuture, builder: (BuildContext context, AsyncSnapshot<http.Response> response) { if (!response.hasData) { return const Center( child: const Text('Loading...'), ); } else if (response.data.statusCode != 200) { return const Center( child: const Text('Error loading data'), ); } else { List<dynamic> json = JSON.decode(response.data.body); List<Widget> reasonList = []; json.forEach((element) { reasonList.add(new ListTile( dense: true, title: new Text(element['reason']), )); }); return new Column(children: reasonList); } }, ) ], ); } } |
If you like this question & answer and want to contribute, then write your question & answer and email to freewebmentor[@]gmail.com. Your question and answer will appear on FreeWebMentor.com and help other developers.