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.

Cómo llamar a una API una vez en FutureBuilder

Mi aplicación tiene diferentes rutas y me gustaría saber cómo llamar a mi API con cubit solo una vez cuando el usuario llega por primera vez a la pantalla y también para no volver a llamar a la API cada vez que regrese a la pantalla ya inicializada.
Mi estructura utiliza bloC
y esta es mi clase de inicialización de la página de perfil.

“`dart
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final user = context.read<authcubit>().state;
final bloc = context.read<profilecubit>();

return Scaffold(
body: FutureBuilder(
future: bloc.updateProfilePicture(user!.id),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return BlocBuilder<profilecubit, profilepicture?="">(
buildWhen: (prev, curr) => prev != curr,
builder: (context, picture) {
return picture != null
? Profile(profilePicture: picture, updateIndex: updateIndex)
: Profile(updateIndex: updateIndex);
},
);
}
return Center(
child: CircularProgressIndicator(
color: Colors.orange,
),
);
},
),
);
}
“`</profilecubit,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para llamar a la API una vez cuando el usuario llega por primera vez a la pantalla y no volver a llamarla cada vez que regrese a la pantalla ya inicializada, puedes utilizar los widgets BlocProvider y BlocListener además del widget BlocBuilder.

    En primer lugar, puedes definir una variable booleana para determinar si la API ha sido llamada antes o no. Puedes establecer esta variable inicialmente en falso y luego cambiarla a verdadero una vez que se haya realizado la llamada a la API.

    Luego, puedes envolver tu widget Scaffold con el widget BlocProvider, pasando tu instancia de ProfileCubit.

    A continuación, puedes envolver tu widget BlocBuilder con un widget BlocListener. Dentro del BlocListener, puedes verificar si la variable booleana es verdadera o falsa. Si es falsa, puedes llamar a la API y establecer la variable booleana en verdadera. Si es verdadera, puedes omitir por completo la llamada a la API.

    Aquí tienes un código actualizado con los cambios:

    class Profile extends StatefulWidget {
      const Profile({Key? key}) : super(key: key);
    
      @override
      _ProfileState createState() => _ProfileState();
    }
    
    class _ProfileState extends State<profile> {
      bool _isApiCalled = false;
    
      @override
      Widget build(BuildContext context) {
        final theme = Theme.of(context);
        final user = context.read<authcubit>().state;
        final bloc = context.read<profilecubit>();
    
        return BlocProvider<profilecubit>(
          create: (context) => bloc,
          child: Scaffold(
            body: BlocListener<profilecubit, profilepicture?="">(
              listener: (context, state) {
                if (!_isApiCalled) {
                  bloc.updateProfilePicture(user!.id);
                  _isApiCalled = true;
                }
              },
              child: BlocBuilder<profilecubit, profilepicture?="">(
                buildWhen: (prev, curr) => prev != curr,
                builder: (context, picture) {
                  return picture != null
                      ? Profile(profilePicture: picture, updateIndex: updateIndex)
                      : Profile(updateIndex: updateIndex);
                },
              ),
            ),
          ),
        );
      }
    }
    

    En resumen, al utilizar los widgets BlocProvider y BlocListener además del widget BlocBuilder, puedes llamar a tu API solo una vez cuando el usuario llega a la pantalla por primera vez y evitar volver a llamarla cada vez que regrese a la pantalla ya inicializada.</profilecubit,></profilecubit,>

Comments are closed.