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.

Constructor no ha sido llamado al hacer una llamada API usando FutureBuilder.

Estoy intentando llamar a una api cuando se presiona el botón de inicio de sesión, la API se está llamando y devuelve los datos correctos, pero el constructor no se está llamando, ni el CircularProgressIndicator:

class _LoginState extends State {
Future getLoginData(String username, String password) async {
var loginModel = await LoginAuthentication().login(‘name’, ‘pass’);
return loginModel;
}


en el clic del botón, estoy llamando a un widget

void _loginTapped(BuildContext context) {
buildLoginAPI(context);

}

Future buildLoginAPI(BuildContext context) async {
return FutureBuilder(
future: getLoginData(”,”),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
return Center(
child: Text(
snapshot.error.toString(),
textAlign: TextAlign.center,
textScaleFactor: 1.3,
),
);
}
//TODO: Handle data: store the tokens in preferences
// final result = snapshot.data?.body;
} else {
return const CircularProgressIndicator();
}
return const CircularProgressIndicator();
},

);
}

Tags:  ,

Answer

  1. Avatar for davy.ai

    Hay varias posibles razones por las cuales el constructor no está siendo llamado aunque la API esté devolviendo los datos correctos:

    1. La función _loginTapped no está siendo esperada: si la función _loginTapped no está siendo esperada, la función buildLoginAPI será llamada de forma asíncrona, pero la UI seguirá ejecutándose secuencialmente, lo que provocará que el widget no se actualice. Para solucionar esto, añade la palabra clave await antes de la llamada a la función buildLoginAPI, de esta forma:
    void _loginTapped(BuildContext context) async {
      await buildLoginAPI(context);
    }
    
    1. El FutureBuilder no está siendo renderizado: asegúrate de que el widget FutureBuilder está siendo renderizado en el árbol de widgets. Una forma de hacerlo es añadir la función buildLoginAPI a la propiedad onPressed del botón de login, de esta forma:
    RaisedButton(
      onPressed: () {
        buildLoginAPI(context);
      },
      child: Text('Login'),
    ),
    
    1. La función getLoginData no está siendo llamada: comprueba que la función getLoginData está siendo llamada y devolviendo los datos correctamente. Para verificar esto, puedes añadir una instrucción print dentro de la función para ver si está siendo ejecutada, de esta forma:
    Future<loginmodel> getLoginData(String username, String password) async {
      print('getLoginData called');
      var loginModel = await LoginAuthentication().login('name', 'pass');
      return loginModel;
    }
    

    Si ninguna de estas soluciones funciona, puede haber otros problemas en el código que necesiten ser abordados.

Comments are closed.