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()
)