He estado creando la aplicación Flutter durante un tiempo y todo parece funcionar bien, pero hoy intenté llamar a initState() en un widget con estado para poder hacer una llamada a la API, pero devuelve un error con el que no estoy familiarizado

Mi código:

class Home extends StatefulWidget {

  final String header;

  Home({Key key, this.header}): super(key: key);

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

class _HomeState extends State<Home>{
  @override
  Widget build(BuildContext context) {

    Top top;
    bool _loading = true;

    fetchData() async {
      setState(() {
        _loading = true;
      });
      //Fetch top Animes
      var res = await http.get(Constants.topAnimes);
      var decodedJson = jsonDecode(res.body);
      print(decodedJson['top']);
      top = Top.fromJson(decodedJson['top']);
      print(top.toJson());


      setState(() {
        _loading = false;
      });
    }

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

    return Container();
  }
}

El error:

I / flutter (24395): ══╡ EXCEPCIÓN ATRAPADA POR LA BIBLIOTECA DE WIDGETS ╞══════════════════════════════════ ═════════════════════════  I / View (24395): envío de clave a io.flutter.view.FlutterView {8dd5ba8 VFE ...... .F ...... 0,0-720,1200}, event = KeyEvent {action = ACTION_DOWN, keyCode = KEYCODE_F11, scanCode = 87, metaState = 0, flags = 0x8, repeatCount = 11805, eventTime = 9200503, downTime = 8597691, deviceId = 2, source = 0x101}  I / flutter (24395): se arrojó la siguiente afirmación al edificio Home (sucio, estado: _HomeState # 5567f):  I / flutter (24395): 'paquete: flutter / src / widgets / framework.dart': Afirmación fallida: línea 1008 pos 12:  I / flutter (24395): '_debugLifecycleState == _StateLifecycle.created': no ​​es cierto.  I / View (24395): envío de clave a io.flutter.view.FlutterView {8dd5ba8 VFE ...... .F ...... 0,0-720,1200}, event = KeyEvent {action = ACTION_DOWN, keyCode = KEYCODE_F11, scanCode = 87, metaState = 0, flags = 0x8, repeatCount = 11806, eventTime = 9200553, downTime = 8597691, deviceId = 2, source = 0x101}  I / aleteo (24395):  I / flutter (24395): o la aserción indica un error en el marco mismo, o deberíamos proporcionar sustancialmente  I / flutter (24395): más información en este mensaje de error para ayudarlo a determinar y solucionar la causa subyacente.  I / flutter (24395): en cualquier caso, informe esta afirmación presentando un error en GitHub:  I / flutter (24395): https://github.com/flutter /flutter/issues/new?template=BUG.md  I / aleteo (24395):  I / flutter (24395): cuando se lanzó la excepción, esta fue la pila:  I / flutter (24395): # 2 State.initState (paquete: flutter / src / widgets / framework.dart: 1008: 12)  I / flutter (24395): # 3 _HomeState.build.initState (paquete: flutter_anime / Screens / home.dart: 66: 13)  I / flutter (24395): # 4 _HomeState.build (paquete: flutter_anime / Screens / home.dart: 70: 14)  I / flutter (24395): # 5 StatefulElement.build (paquete: flutter / src / widgets / framework.dart: 3825: 27)  I / flutter (24395): # 6 ComponentElement.performRebuild (paquete: flutter / src / widgets / framework.dart: 3736: 15)  I / flutter (24395): # 7 Element.rebuild (paquete: flutter / src / widgets / framework.dart: 3559: 5)  I / flutter (24395): # 8 ComponentElement._firstBuild (paquete: flutter / src / widgets / framework.dart: 3716: 5)  I / flutter (24395): # 9 StatefulElement._firstBuild (paquete: flutter / src / widgets / framework.dart: 3864: 11)  I / flutter (24395): # 10 ComponentElement.mount (paquete: flutter / src / widgets / framework.dart: 3711: 5)  I / flutter (24395): # 11 Element.inflateWidget (paquete: flutter / src / widgets / framework.dart: 2956: 14)  I / flutter (24395): # 12 Element.updateChild (paquete: flutter / src / widgets / framework.dart: 2759: 12)  I / flutter (24395): # 13 SingleChildRenderObjectElement.mount (paquete: flutter / src / widgets / framework.dart: 4876: 14)  I / flutter (24395): # 14 Element.inflateWidget (paquete: flutter / src / widgets / framework.dart: 2956: 14)  I / flutter (24395): # 15 Element.updateChild (paquete: flutter / src / widgets / framework.dart: 2759: 12)  I / flutter (24395): # 16 ComponentElement.performRebuild (paquete: flutter / src / widgets / framework.dart: 3747: 16)  I / flutter (24395): # 17 Element.rebuild (paquete: flutter / src / widgets / framework.dart: 3559: 5)  I / flutter (24395): # 18 ComponentElement._firstBuild (paquete: flutter / src / widgets / framework.dart: 3716: 5)  I / flutter (24395): # 19 ComponentElement.mount (paquete: flutter / src / widgets / framework.dart: 3711: 5)  I / flutter (24395): # 20 Element.inflateWidget (paquete: flutter / src / widgets / framework.dart: 2956: 14)  I / flutter (24395): # 21 Element.updateChild (paquete: flutter / src / widgets / framework.dart: 2759: 12)  I / flutter (24395): # 22 SingleChildRenderObjectElement.mount (paquete: flutter / src / widgets / framework.dart: 4876: 14)  I / flutter (24395): # 23 Element.inflateWidget (paquete: flutter / src / widgets / framework.dart: 2956: 14)  I / flutter (24395): # 24 Element.updateChild (paquete: flutter / src / widgets / framework.dart: 2759: 12)  I / flutter (24395): # 25 SingleChildRenderObjectElement.mount (paquete: flutter / src / widgets / framework.dart: 4876: 14)  I / flutter (24395): # 26 Element.inflateWidget (paquete: flutter / src / widgets / framework.dart: 2956: 14)  I / flutter (24395): # 27 Element.updateChild (paquete: flutter / src / widgets / framework.dart: 2759: 12)  I / flutter (24395): # 28 SingleChildRenderObjectElement.mount (paquete: flutter / src / widgets / framework.dart: 4876: 14)  I / flutter (24395): # 29 Element.inflateWidget (paquete: flutter / src / widgets / framework.dart: 2956: 14)  I / flutter (24395): # 30 Element.updateChild (paquete: flutter / src / widgets / framework.dart: 2759: 12)  I / flutter (24395): # 31 SingleChildRenderObjectElement.mount (paquete: flutter / src / widgets / framework.dart: 4876: 14)  I / flutter (24395): # 32 Element.inflateWidget (paquete: flutter / src / widgets / framework.dart: 2956: 14)  I / flutter (24395): # 33 Element.updateChild (paquete: flutter / src / widgets / fra

0
JideGuru 16 abr. 2019 a las 09:10

3 respuestas

La mejor respuesta

Todas sus propiedades de estado y el método initState están en su método de compilación. Moverlos fuera del método de compilación. Además, el valor inicial de la variable _loading es verdadero, por lo que no es necesario volverlo a establecer al principio de la función fetchData.

class Home extends StatefulWidget {
  final String header;

  Home({Key key, this.header}): super(key: key);

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

class _HomeState extends State<Home>{
  Top top;
  bool _loading = true;

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

  @override
  Widget build(BuildContext context) {
    if(_loading) {
        return CircularProgressIndicator();
    }

    return Container(
        child: Text("LOADED");
    );
  }

  fetchData() async {
    //Not needed since it's already set to true.
    /*setState(() {
      _loading = true;
    });*/

    //Fetch top Animes
    var res = await http.get(Constants.topAnimes);

    var decodedJson = jsonDecode(res.body);
    print(decodedJson['top']);

    top = Top.fromJson(decodedJson['top']);
    print(top.toJson());

    setState(() {
      _loading = false;
    });
  }
}
2
Spectarion 16 abr. 2019 a las 07:05

La razón podría ser que, al llegar a la página de inicio desde la página anterior, depende de un valor futuro, puede ser una preferencia compartida o obtener datos HTTP, tan pronto como el futuro obtenga su valor, eliminará la página de inicio. Tr para usar esperar a esa llamada y luego navegar a la página siguiente.

0
Shreyash Jain 17 may. 2020 a las 09:37

No hay ninguna razón para llamar a setState() dentro de un método initState(). Establecer estado es desencadenar una reconstrucción cuando cambia una variable. Por ejemplo, si desea utilizar el booleano _loading para mostrar algún tipo de widget indicador de carga al que desea llamar setState() para permitir que Flutter reconstruya el árbol.

Pero la parte importante es que solo necesita setState() cuando cambia una variable durante el ciclo de vida del widget. Significado después de que initState () haya finalizado y su widget esté construido. Usualmente llamas setState() cuando f.ex. presione un botón para activar la llamada API. Luego, le gustaría establecer _loading dentro de un setState() para reconstruir el widget.

Sin embargo, en el método initState() no se construye ningún árbol. Cada variable que cambie durante esta llamada de función se reflejará una vez que se construya el widget. Simplemente elimine el setState() y configure directamente sus variables sin él.

Supongo que esto aclaró esta pregunta. Si no ... ¿para qué estás utilizando _loading?

1
Robin Reiter 16 abr. 2019 a las 06:20