Al implementar el widget Dismissible, tengo un error al eliminar un elemento.

    return Dismissible(
      key: Key(widget.product.id),
      onDismissed: (direction) {
        setState(() {
          BlocProvider.of<ManagerBloc>(context)
              .add(RemoveProduct(widget.product));
        });

El padre de este niño se parece a

          return ListView.builder(
              itemCount: state.shopItem.length,
              itemBuilder: (BuildContext context, int index) {
                return ProductElement(product: state.shopItem[index]);
              });
        }

Lo moví a parent y eliminé shopItem.removeAt() con blocProvider pero aún así obtuve este isseu. Incluso si elimino el objeto usando remove en la lista, muestra este mismo mensaje de error:

    if (event is RemoveProduct) {
      await shopListRepository.remove(event.product);
      yield DefaultDataManager((state as DefaultDataManager)
          .shopItem
          .where((item) => item.id != event.product.id)
          .toList());
    }

Probé UniqueKey y fue el mismo resultado. Mi product_id es '64b7ff60-f782-11e9-a3e8-a9ee0aa87ea5' generado por uuid.v1 ().

0
mkubasz 28 oct. 2019 a las 01:38

1 respuesta

La mejor respuesta

Creo que el problema es que no está eliminando el modelo de datos cuya lista genera la IU justo después (de forma sincrónica) onDismissed de que se llamó. Supongamos que tiene un List<Item> _items en el State de su widget que almacena el modelo de datos de IU que llena la lista. Lo que tienes que hacer para que Dismissible funcione es llamar a _items.remove(item) en tu State sincrónicamente cuando se llama a onDismissed.

Por lo tanto, no await en el medio y no simplemente elimine el elemento del repositorio, elimínelo del State real también (le digo esto específicamente porque puedo ver que lo está haciendo {{X2 }}).

0
drogel 28 oct. 2019 a las 07:39