Hola, estoy tratando de llamar a una API POST usando chopper. pero me esta dando

"Error: no se pudo encontrar el proveedor correcto sobre este widget de página de inicio de sesión".

Incluso he agregado el proveedor como el widget ancestro a la página.

¿Qué estoy haciendo mal? por favor ayuda.

 @override
 Widget build(BuildContext context) {
return Provider(
  create: (_) => ApiService.create(),
  dispose: (context, ApiService service) => service.client.dispose(),
  child: Container(
                          width: double.infinity,
                          child: ButtonTheme(
                            height: 36.0,
                            child: RaisedButton(
                              onPressed: () async {
                                //Navigator.pushReplacementNamed(context, "/myjourney");
                                print("Arpit: ${_emailController.text + " " +_passwordController.text}");
                                generateMd5(_passwordController.text);
                                String email = _emailController.text;
                                String password = generateMd5(_passwordController.text);
                                 final response = await Provider.of<ApiService>(context)
                                  .doLogin("d1d2fe0514f7d5c748c0e7e085b36f74",email,password,"App");
                              print(response.body);
                              },
                              color: Colors.white,
                              disabledColor: Colors.white,
                              shape: BeveledRectangleBorder(),
                              textColor: Colors.indigo,
                              padding: EdgeInsets.all(8.0),
                              splashColor: Color(0xFF6c60e4),
                              child: Text("SIGN IN", style: TextStyle(
                                  fontFamily: "Montserrat",
                                  fontSize: 15.0,
                                  color: Colors.indigo,fontWeight: FontWeight.bold)),
                            ),
                          )
                      ),
);

}

0
Arpit Todewale 6 may. 2020 a las 13:02

2 respuestas

La mejor respuesta

Recibes el error porque no estás colocando el Provider sobre el Login Page que lo necesita.

Tiene que poner cualquier Provider que esté usando encima de cualquier widget que lo use. Este proceso se llama Lifting state up.

Para corregir el error, elimine el widget Provider del widget Login y envuélvalo en el widget raíz de su aplicación.

Como el siguiente código:

void main() {
  runApp(
    Provider(
    create: (_) => ApiService.create(),
    dispose: (context, ApiService service) => service.client.dispose(),      
    child: MyApp(),
    ),
  );
}

Para leer más sobre levantar el estado. Consulte el siguiente enlace:

Usar el proveedor correctamente

Espero que esto ayude.

1
Random Guru 6 may. 2020 a las 10:13

Podría usar un Consumidor a continuación para evitar usar el contexto incorrecto:

@override
Widget build(BuildContext context) {
  return Provider(
    create: (_) => Foo(),
    child: Consumer<Foo>(
      builder: (_, foo, __) => Text(foo.value),
    },
  );
}

Así:

@override
 Widget build(BuildContext context) {
return Provider<ApiService>(
  create: (_) => ApiService.create(),
  dispose: (context, ApiService service) => service.client.dispose(),
  child: Consumer<ApiService>(
          builder: (_, apiService, __) => Container(
                          width: double.infinity,
                          child: ButtonTheme(
                            height: 36.0,
                            child: RaisedButton(
                              onPressed: () async {
                                //Navigator.pushReplacementNamed(context, "/myjourney");
                                print("Arpit: ${_emailController.text + " " +_passwordController.text}");
                                generateMd5(_passwordController.text);
                                String email = _emailController.text;
                                String password = generateMd5(_passwordController.text);
                                 final response = await apiService.doLogin("d1d2fe0514f7d5c748c0e7e085b36f74",email,password,"App");
                              print(response.body);
                              },
                              color: Colors.white,
                              disabledColor: Colors.white,
                              shape: BeveledRectangleBorder(),
                              textColor: Colors.indigo,
                              padding: EdgeInsets.all(8.0),
                              splashColor: Color(0xFF6c60e4),
                              child: Text("SIGN IN", style: TextStyle(
                                  fontFamily: "Montserrat",
                                  fontSize: 15.0,
                                  color: Colors.indigo,fontWeight: FontWeight.bold)),
                            ),
                          )
                      ),
);

Consulte la documentación del consumidor aquí: https://pub.dev/documentation/provider/latest/provider/ Consumer-class.html

0
camillo777 6 may. 2020 a las 10:14