Tengo una lista de datos que tiene id:

 [
        {
            "id": 1,
            "title": "close",
        },
        {
            "id": 2,
            "title": "car",
        },

Muestro esta lista en la vista de lista con eje horizontal:

Column(
              children: <Widget>[
                Container(
                  height: 50.0,
                  color: Colors.white,
                  child: ListView.builder(
                    scrollDirection: Axis.horizontal,
                    itemCount: _categories.data.length,
                    itemBuilder: (_, index) {
                      return Container(
                        child: InkWell(
                          onTap: () {
                            setState(() {
                              _selectedCat = _categories.data[index].id;
                            });
                          },
                          child: Container(
                            color: (index + 1) ==
                                    _categories.pagination.currentPage
                                ? Colors.red
                                : Colors.white,
                            margin: EdgeInsets.all(8.0),
                            child: Text(
                              _categories.data[index].title,
                              style: TextStyle(
                                  fontSize: 16.0, fontWeight: FontWeight.bold),
                            ),
                          ),
                        ),
                      );
                    },
                  ),
                ),
                Expanded(child: CategoryWidget(selectedCat: _selectedCat))
              ],
            ),

En CategoryWidget i muestra elementos relacionados con los datos anteriores:

class CategoryWidget extends StatefulWidget {
  final int id;
  const CategoryWidget({@required this.id});

  @override
  _CategoryWidgetState createState() => _CategoryWidgetState();
}

class _CategoryWidgetState extends State<CategoryWidget> {
  Future _future;

  @override
  void initState() {
    _future = HomeProvider().getItems(widget.id); // not triggered 
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: FutureBuilder<ItemModel>(
        future: _futureCategory,
        builder: (context, snapshot) {
         if (snapshot.hasData) {
            return ListView.builder(
                itemCount: snapshot.data.data.length,
                itemBuilder: (_, index) {
                  return Text(snapshot.data.data[index].name);
                });
        },
      ),
    );
  }
}

Pero cuando grabé en cada elemento horizontal:

  onTap: () {
    setState(() {
      _selectedCat = _categories.data[index].id;
    });
  }

Y el estado establecido está hecho, initState en CategoryWidget no se activa?

0
sayres kabir 25 may. 2020 a las 20:35

3 respuestas

La mejor respuesta

Se mencionó claramente en la clase de estado 'docs.

Creo que la forma correcta de hacer esto es anular el método didUpdateWidget en la subclase State.

@override
  void initState() {
    _getItem();
    super.initState();
  }

  @override
  void didUpdateWidget(CategoryWidget oldWidget) {
    _getItem();
    super.didUpdateWidget(oldWidget);
  }

  void _getItem() async {
    _future = HomeProvider().getItems(widget.id);
  }
0
sayres kabir 25 may. 2020 a las 18:13

initState() no se activa cuando reconstruye el estado, solo se activa una vez y es cuando se carga el widget, el método build es lo que se activa cuando reconstruye su estado.

Cambia tu código a esto:

 @override
  Widget build(BuildContext context) {
   _future = HomeProvider().getItems(widget.id);
    return Container(
      child: FutureBuilder<ItemModel>(
        future: _futureCategory,
        builder: (context, snapshot) {
         if (snapshot.hasData) {
            return ListView.builder(
                itemCount: snapshot.data.data.length,
                itemBuilder: (_, index) {
                  return Text(snapshot.data.data[index].name);
                });
        },
      ),
    );
  }
}
0
hiwa jalal 25 may. 2020 a las 17:52

Voy por tu tema

El widget initState en estado personalizado completo no se activa por segunda vez

InitState solo se llama durante la creación del estado por primera vez.

  @override
  Widget build(BuildContext context) {
   _future = HomeProvider().getItems(widget.id);

}
0
Dipesh 25 may. 2020 a las 18:23