widgets listtile itembuilder generate list object widget flutter

itembuilder - listtile flutter



Generando nuevas tarjetas basadas en la lista de objetos (1)

Tengo una lista de objetos, ¿hay alguna manera de recorrer un widget de Tarjeta para que, para cada objeto de esta lista, se cree una nueva tarjeta con los atributos de este widget de interés?

El siguiente código definitivamente no funciona, solo sirve como ilustración para mostrar la lógica detrás de lo que intento lograr

//function declaration and body... List<CardInfo> list = new List(); for (var i in cardInfo){ //cardInfo is a list of json created previously. list.add(new CardInfo.fromJson(i)); print (list); }//tested the list and it contains the objects I want return list; }

...

//my widget{ @override Widget build(BuildContext context) { return new Dismissible( for (i in list){ child: new Card( child: new ListTile(leading: new Icon(Icons.star, color: Colors.yellowAccent,), title: new Text(list(i).field1),//field1 is a string in CardInfo subtitle: new Text(list(i).field2),//field2 is a string in CardInfo

¿Es esto factible de alguna manera?

Actualizar

Descubrí que convertir cada JSON en objeto y luego trabajar con los objetos directamente, ahora la función _loadData () devuelve un objeto en cada iteración

_loadData() async { var url = ''myurl''; var httpClient = createHttpClient(); var response =await httpClient.get(url); List cardInfo = JSON.decode(response.body); List<CardInfo> list = new List(); for ( var i in cardInfo){ var ci = new CardInfo.fromJson(i); list.add(new CardInfo.fromJson(i)); return ci; } //return list; } ....

Entonces, ¿hay alguna manera de configurar mi constructor de clase para que me permita acceder a los campos de los objetos devueltos? algo como esto:

title: new Text(new CardInfo(_loadData()).field)

Actualización 2:

@override Widget build(BuildContext context) { return new FutureBuilder( future: _loadData(), builder: (BuildContext context, AsyncSnapshot<List> jsonList){ if (jsonList.hasData==true){ var cardInfo = jsonList.data[0];//is this right ? print (cardInfo); return new Dismissible( child: new Column( children: cardInfo.map( (CardInfo info)=> new Card( child: new ListTile(leading: new Icon(Icons.star, color: Colors.yellowAccent,), title: new Text(info.field), subtitle: new Text("Subtitle"),) ) ), ),....

Mi función está en la parte superior de la siguiente manera:

_loadData() async { var url = ''myurl''; var httpClient = createHttpClient(); var response = await httpClient.get(url); List cardInfo = JSON.decode(response.body); List<CardInfo> list = new List(); for (var i in cardInfo) { list.add(new CardInfo.fromJson(i)); } return list; }

Obtuve el siguiente error:

La clase ''CardInfo'' no tiene un método de instancia ''map''.


Puede usar el método Iterable.map para hacer esto. Por ejemplo:

new Column( children: list.map( (CardInfo info) => new Card(child: new Text(info.field1)), ).toList() )