es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Flutter: Cómo agregar un elemento a ListView de manera dinámica utilizando BloC

Tengo una pequeña aplicación de Flutter. En esta aplicación tengo una ruta hacia un Stateless widget desde un Stateful widget. Y setState(…) no funciona en un Stateless widget. Además, Navigator.push(…) no redirecciona a Stateful widgets.

Quiero agregar elementos a ListView de manera dinámica usando el botón ‘Agregar elemento’. ¿Cómo puedo hacerlo usando BloC? ¿Dónde puedo encontrar la documentación necesaria? ¿Y puedes mostrarme una pequeña parte de código?

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar elementos dinámicamente a un ListView utilizando BloC, es necesario crear un BloC para gestionar el estado del ListView. Aquí están los pasos para hacerlo:

    1. Crear una clase BloC con un estado que represente una lista de elementos:
    class ListViewBloc {
      final _itemsController = StreamController<><string>>();
    
      Stream<><string>> get items => _itemsController.stream;
    
      add(String item) {
        _items.add(item);
        _itemsController.add(_items.toList());
      }
    
      dispose() {
        _itemsController.close();
      }
    }
    
    1. En su widget Stateful, crear una instancia del BloC e inicializar el ListView con su estado inicial:
    class MyStatefulWidget extends StatefulWidget {
      @override
      _MyStatefulWidgetState createState() => _MyStatefulWidgetState();
    }
    
    class _MyStatefulWidgetState extends State<mystatefulwidget> {
      final bloc = ListViewBloc();
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Mi App'),
          ),
          body: StreamBuilder<><string>>(
            stream: bloc.items,
            builder: (context, snapshot) {
              if (!snapshot.hasData) {
                return Center(child: CircularProgressIndicator());
              }
    
              return ListView.builder(
                itemCount: snapshot.data.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text(snapshot.data[index]),
                  );
                },
              );
            },
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              bloc.add('Nuevo elemento');
            },
            child: Icon(Icons.add),
          ),
        );
      }
    
      @override
      void dispose() {
        bloc.dispose();
        super.dispose();
      }
    }
    
    1. En el widget Stateful, utilizar el BloC para actualizar el ListView cuando se agrega un nuevo elemento:
    floatingActionButton: FloatingActionButton(
      onPressed: () {
        bloc.add('Nuevo elemento');
      },
      child: Icon(Icons.add),
    ),
    

    Puede encontrar más información sobre BloC en la documentación oficial https://bloclibrary.dev/docs/ así como en otros recursos en la web.

Comments are closed.