Posteriormente a consultar expertos en la materia, programadores de diversas ramas y maestros dimos con la respuesta al dilema y la plasmamos en este post.
Esto debería solucionar tu problema. Básicamente, siempre desea que sus Widgets se creen en su build
jerarquía de métodos.
import 'dart:async';
import 'package:flutter/material.dart';
void main() => runApp(new MaterialApp(home: new Scaffold(body: new MainWidget())));
class MainWidget extends StatefulWidget
@override
State createState() => new MainWidgetState();
class MainWidgetState extends State
List _data = new List();
Timer timer;
Widget build(BuildContext context)
return new ListView(children: _data.map((item) => new ChildWidget(item)).toList());
@override
void initState()
super.initState();
timer = new Timer.periodic(new Duration(seconds: 2), (Timer timer) async
ItemData data = await loadData();
this.setState(()
_data = [data];
);
);
@override
void dispose()
super.dispose();
timer.cancel();
static int testCount = 0;
Future loadData() async
testCount++;
return new ItemData("Testing #$testCount");
class ChildWidget extends StatefulWidget
ItemData _data;
ChildWidget(ItemData data)
_data = data;
@override
State createState() => new ChildState();
class ChildState extends State
@override
Widget build(BuildContext context)
return new GestureDetector(onTap: () => foo(),
child: new Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
child: new Card(
child: new Container(
padding: const EdgeInsets.all(8.0),
child: new Text(widget._data.title),
),
),
)
);
foo()
print("Card Tapped: " + widget._data.toString());
class ItemData
final String title;
ItemData(this.title);
@override
String toString()
return 'ItemDatatitle: $title';
Esto realmente me estaba dando dolor de cabeza y no funcionaba ningún resultado de Google. Lo que finalmente funcionó fue muy simple. En su child build() asigne el valor a la variable local antes de regresar. Una vez que hice esto, todo funcionó con cargas de datos posteriores. Incluso saqué el código initState().
Muchas gracias a @Simon. Tu respuesta de alguna manera me inspiró a probar esto.
En su estado hijo:
@override
Widget build(BuildContext context)
_title = widget._title; // <<< ADDING THIS HERE IS THE FIX
return new GestureDetector(onTap: foo(),
child: new Card(child: new Text(_title));
Esperemos que esto funcione en su código. Para mí, uso un Mapa para todo el registro JSON que se pasa, en lugar de una sola Cadena, pero eso aún debería funcionar.