Saltar al contenido

Flutter: setState no actualiza el widget con estado interno

Posteriormente a consultar expertos en la materia, programadores de diversas ramas y maestros dimos con la respuesta al dilema y la plasmamos en este post.

Esto debería solucionar tu problema. Básicamente, siempre desea que sus Widgets se creen en su build jerarquía de métodos.

import 'dart:async';

import 'package:flutter/material.dart';

void main() => runApp(new MaterialApp(home: new Scaffold(body: new MainWidget())));

class MainWidget extends StatefulWidget 
    @override
    State createState() => new MainWidgetState();


class MainWidgetState extends State 

    List _data = new List();
    Timer timer;

    Widget build(BuildContext context) 
        return new ListView(children: _data.map((item) => new ChildWidget(item)).toList());
    

    @override
    void initState() 
        super.initState();
        timer = new Timer.periodic(new Duration(seconds: 2), (Timer timer) async 
            ItemData data = await loadData();
            this.setState(() 
                _data = [data];
            );
        );
    


    @override
    void dispose() 
        super.dispose();
        timer.cancel();
    

    static int testCount = 0;

    Future loadData() async 
        testCount++;
        return new ItemData("Testing #$testCount");
    


class ChildWidget extends StatefulWidget 

    ItemData _data;

    ChildWidget(ItemData data) 
        _data = data;
    

    @override
    State createState() => new ChildState();


class ChildState extends State 

    @override
    Widget build(BuildContext context) 
        return new GestureDetector(onTap: () => foo(),
            child: new Padding(
                padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
                child: new Card(
                    child: new Container(
                        padding: const EdgeInsets.all(8.0),
                        child: new Text(widget._data.title),
                    ),
                ),
            )
        );
    

    foo() 
        print("Card Tapped: " + widget._data.toString());
    


class ItemData 
    final String title;

    ItemData(this.title);

    @override
    String toString() 
        return 'ItemDatatitle: $title';
    

Esto realmente me estaba dando dolor de cabeza y no funcionaba ningún resultado de Google. Lo que finalmente funcionó fue muy simple. En su child build() asigne el valor a la variable local antes de regresar. Una vez que hice esto, todo funcionó con cargas de datos posteriores. Incluso saqué el código initState().

Muchas gracias a @Simon. Tu respuesta de alguna manera me inspiró a probar esto.

En su estado hijo:

@override
Widget build(BuildContext context) 
_title = widget._title; // <<< ADDING THIS HERE IS THE FIX
return new GestureDetector(onTap: foo(),
   child: new Card(child: new Text(_title));


Esperemos que esto funcione en su código. Para mí, uso un Mapa para todo el registro JSON que se pasa, en lugar de una sola Cadena, pero eso aún debería funcionar.

¡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 *