Comments (5)
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.
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.
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.
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.
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)
- fix: Bloc Consumer's listener is passing the previous instance of the bloc to the method HOT 2
- fix: Bloc with searchAnchor Widget HOT 3
- fix: emitting a state in a closed Cubit throws an error HOT 5
- Unable to upgrade to 4.0.0 Bloc plugin on Intellij HOT 5
- perf: Example of not duplicating data with repository pattern in todos example HOT 4
- Emit that occurs during init doesn't cause a rebuild HOT 1
- How to rely on data from another Stream? HOT 4
- question: is this considered a anti pattern if a repository depends on another bloc. HOT 2
- docs: RTL in documentation
- feat: allow user to choose which event or state change to be captured in the changeStack or not HOT 2
- feat: Translation of menu and prev, next, note title in the document HOT 1
- question: UI interactivity and separation of concerns HOT 2
- question: Having a bloc inherit from a another bloc HOT 1
- style: Move the "props" getter to the parent (sealed) class HOT 1
- fix: How to listen to multiple streams in a single event? HOT 1
- feat: can we rename copyWith to replaceWith HOT 1
- fix: com.bloc.intellij_generator_plugin.action.GenerateBlocAction retains disposed Project HOT 3
- feat: Enhance BlocBuilder with Dependencies for Selective State Changes HOT 1
- [help] Best Practice for Sharing Events and States Across Multiple Blocs, Bloc to Bloc communications HOT 8
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from bloc.