Comments (2)
Hey @narcodico 👋
Thanks for opening an issue!
It seems a bit risky to do this because if I'm understanding correctly, this change could result in runtime type exceptions since bloc would be casting the object to type E
for you.
What would be the benefit of that as opposed to:
await emit.onEach(
_repository.watchData(),
onData: (data) => add(DataChanged(data)),
onError: (failure, stackTrace) => add(DataFailed(failure as MyFailure, stackTrace)),
);
The other issue is onError
might be called with errors that are outside of the scope of _repository.watchData()
for example, if the underlying stream isn't a broadcast stream and there are multiple subscriptions, onError
would be called with a StateError
.
As a result, I don't think it's safe to do this because the underlying subscription mechanism operates on Object
so I don't think we can always safely make the type more specific without risking runtime TypeErrors.
Let me know what you think and thanks again for taking the time to file this issue! 🙏
from bloc.
Hey @felangel 👋
What would be the benefit of that as opposed to:
await emit.onEach( _repository.watchData(), onData: (data) => add(DataChanged(data)), onError: (failure, stackTrace) => add(DataFailed(failure as MyFailure, stackTrace)), );
The benefit would be that it would save the developer from manually having to do the cast. It's if the current onEach
would not accept a generic data type, but rather would give you a dynamic back and then you'd have to do:
onData: (data) => add(DataChanged(data as MyData))
. It's not as clean as having a generic type.
The other issue is
onError
might be called with errors that are outside of the scope of_repository.watchData()
for example, if the underlying stream isn't a broadcast stream and there are multiple subscriptions,onError
would be called with aStateError
.
I completely agree with this, but at the same time, a developer opting out of the default Object
for a custom type would do that because the errors on the stream were handled and converted into a custom failure, e.g.:
Stream<MyData> watchData() => _dataSource.stream.handleError(
(Object error, StackTrace stackTrace) =>
throw MyFailure.from(error, stackTrace),
);
but is also aware of how the stream is being used.
I also feel that the StateError
you mentioned about non-broadcast streams being listen to multiple times should not be gracefully handled, since it's an error, not an exception, and should be fixed before releasing.
I can't think of a different error besides this, that could potentially happen after listening to a stream were you handle errors like the one above. Can you?
As a result, I don't think it's safe to do this because the underlying subscription mechanism operates on
Object
so I don't think we can always safely make the type more specific without risking runtime TypeErrors.
This feature would be great for developers that want to take full control over error handling. I think the usage it's pretty much in the hands of the developer. And the great thing is that not specifying a custom error type would continue operating on Object
.
from bloc.
Related Issues (20)
- fix: States of Different instances of the same bloc are interfering
- docs: BlocListener example loss a "," HOT 1
- chore: refactoring to `bloc` advices needed HOT 4
- fix: Bloc not calling while calling event with cascade in BlocProvider. But working fine if assigned to a variable and passed to BlocProvider. HOT 1
- fix: expected: [<States>], actual [] when unit testing landing page cubit HOT 4
- Bad state: Cannot emit new states after calling close HOT 2
- State not update when adding a new item to the list HOT 1
- question: Is it a good practice to use "business" bloc HOT 4
- docs: replay bloc with multi bloc HOT 2
- fix: MultiBlocProvider and easy_localization library problem HOT 2
- docs: Add zh-cn translation for Bloc Concepts page HOT 1
- fix: transformer works incorrectly while registering each event separately HOT 2
- feat: Make hydrated_storage.dart:Storage.read() method async
- BlocBuilder widget not rebuilding the ui on certain states. HOT 6
- question: How do I design the architecture of A very complex desktop app HOT 3
- feat(bloc): add support for optional `StackTrace` on error handlers for `Emitter.onEach`/`Emitter.forEach` HOT 2
- feat: Add `force` to Emitter HOT 7
- feat: Privacy manifest file for iOS is missing HOT 4
- question: BlocObserver and Injectable Singletons HOT 3
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.