Saltar al contenido

Cómo usar FutureBuilder dentro de SliverList

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 Futures o Streams, 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)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *