Coder Social home page Coder Social logo

Comments (5)

felangel avatar felangel commented on July 18, 2024

Hi @ignicubeLaeeq 👋
Thanks for opening an issue!

Can you please provide some additional context regarding what you're trying to achieve? It'd be amazing if you could provide a link to an open source repository that I can checkout and run locally which illustrates the problem you're facing, thanks!

from bloc.

ignicubeLaeeq avatar ignicubeLaeeq commented on July 18, 2024

Hi @felangel ,
Thank you for your response. Following is a simple example in which i have idToken saved in authbloc which i need to pass in headers for my api requests.

Dio dio(BuildContext context) {
  final dio = Dio(
    BaseOptions(
      baseUrl: Endpoints.backend,
      connectTimeout: const Duration(seconds: 5),
      receiveTimeout: const Duration(seconds: 5),
    ),
  );

  dio.interceptors.add(
    InterceptorsWrapper(
      onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
        final authBloc = context.read<AuthBloc>();
        final token = authBloc.state.token;

        if (token != null) {
          options.headers.addAll({
            'Authorization': 'Bearer $token',
          });
        }

        StyledSnackbar.show('Requesting ${options.uri}');
        return handler.next(options);
      },
      onResponse: (Response response, ResponseInterceptorHandler handler) {
        StyledSnackbar.show(response.toString());
        return handler.next(response);
      },
      onError: (DioException error, ErrorInterceptorHandler handler) {
        StyledSnackbar.show(error.toString());
        return handler.next(error);
      },
    ),
  );

  return dio;
}

I want to do it once on app level and not pass context or token for every api call.
I may need to make the api call from within bloc where i dont have context.
i may need to make the api call from another bloc where i dont have context or token.
Hope this clarifies.
Thanks

from bloc.

felangel avatar felangel commented on July 18, 2024

Hi @felangel , Thank you for your response. Following is a simple example in which i have idToken saved in authbloc which i need to pass in headers for my api requests.

Dio dio(BuildContext context) {
  final dio = Dio(
    BaseOptions(
      baseUrl: Endpoints.backend,
      connectTimeout: const Duration(seconds: 5),
      receiveTimeout: const Duration(seconds: 5),
    ),
  );

  dio.interceptors.add(
    InterceptorsWrapper(
      onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
        final authBloc = context.read<AuthBloc>();
        final token = authBloc.state.token;

        if (token != null) {
          options.headers.addAll({
            'Authorization': 'Bearer $token',
          });
        }

        StyledSnackbar.show('Requesting ${options.uri}');
        return handler.next(options);
      },
      onResponse: (Response response, ResponseInterceptorHandler handler) {
        StyledSnackbar.show(response.toString());
        return handler.next(response);
      },
      onError: (DioException error, ErrorInterceptorHandler handler) {
        StyledSnackbar.show(error.toString());
        return handler.next(error);
      },
    ),
  );

  return dio;
}

I want to do it once on app level and not pass context or token for every api call. I may need to make the api call from within bloc where i dont have context. i may need to make the api call from another bloc where i dont have context or token. Hope this clarifies. Thanks

I highly recommend moving auth token management down into your networking layer. Blocs should generally not know about auth tokens. I recommend using https://pub.dev/packages/fresh_dio. Check out this example for reference https://github.com/felangel/fresh/blob/ce9d5dc202315ef96b6eb04e14d03a667f9bc8f4/packages/fresh_dio/example/packages/jsonplaceholder_client/lib/src/jsonplaceholder_client.dart#L40

from bloc.

ignicubeLaeeq avatar ignicubeLaeeq commented on July 18, 2024

Thank you for your response.
I have checked out this package, but without enough examples i am reluctant to try it. Moreover i am implementing firebase auth, and since firebase manages the tokens which are short lived, i just need to get the latest token and keep it somewhere in my app. I have been able to that as follows:

  updateToken(
    AuthEventWatchTokenStream event,
    Emitter<AuthState> emit,
  ) async {
    await emit.forEach(
      FirebaseAuth.instance
          .idTokenChanges()
          .asyncMap((user) async => await user?.getIdToken(true)),
      onData: (idToken) => state.copyWith(token: idToken),
    );
  }

Theoretically speaking, is there was a way to access my state without context as per my use case?
Regards

from bloc.

felangel avatar felangel commented on July 18, 2024

Thank you for your response. I have checked out this package, but without enough examples i am reluctant to try it. Moreover i am implementing firebase auth, and since firebase manages the tokens which are short lived, i just need to get the latest token and keep it somewhere in my app. I have been able to that as follows:

  updateToken(
    AuthEventWatchTokenStream event,
    Emitter<AuthState> emit,
  ) async {
    await emit.forEach(
      FirebaseAuth.instance
          .idTokenChanges()
          .asyncMap((user) async => await user?.getIdToken(true)),
      onData: (idToken) => state.copyWith(token: idToken),
    );
  }

Theoretically speaking, is there was a way to access my state without context as per my use case? Regards

You can use any other service locator (e.g. get_it) if you prefer.

Closing for now since there doesn't appear to be any actionable next steps.

from bloc.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.