Posteriormente a consultar expertos en este tema, programadores de deferentes ramas y maestros hemos dado con la respuesta al problema y la compartimos en esta publicación.
Solución:
los hijos de un CustomScrollView
deben ser astillas, no puedes usar un FutureBuilder
.
En su lugar, reconstruya el CustomScrollView
cuando el futuro se complete:
// build fixed items outside of the FutureBuilder for efficiency
final someOtherSliver = SliverToBoxAdapter(...);
return FutureBuilder>(
future: getQuake(), // this is a code smell. Make sure that the future is NOT recreated when build is called. Create the future in initState instead.
builder: (context, snapshot)
Widget newsListSliver;
if(snapshot.hasData)
newsListSliver = SliverList(delegate: SliverChildBuilderDelegate(...))
else
newsListSliver = SliverToBoxAdapter(child: CircularProgressIndicator(),);
return CustomScrollView(
slivers: [
someOtherSliver,
newsListSliver
],
);
,
);
Si tiene varias astillas que dependen de Future
s o Stream
s, puedes encadenar los constructores:
return FutureBuilder<..>(
...
builder: (context, snapshot1)
return FutureBuilder<..>(
...
builder: (context, snapshot2)
return CustomScrollView(...);
)
)
Usar SliverFillRemaining
Widget build(BuildContext context) {
return new Scaffold(
body: CustomScrollView(
slivers: [
SliverFillRemaining(
child: FutureBuilder(
future: getData(),
builder: (context, snapshot)
if (snapshot.data == null)
return new Container(
child: Center(child: new CircularProgressIndicator()),
);
else
return Text(snapshot.data.name);
,
),
)
],
)
);
O use SliverList
Widget build(BuildContext context)
return new Scaffold(
body: CustomScrollView(
slivers: [
SliverList(
delegate: SliverChildListDelegate([Container(
child: FutureBuilder(
future : getData(),
builder: (C,snap)
//do whatever you want
)
)]),
)
]
)
)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)