Closed Guang1234567 closed 5 years ago
Heya -- this is a common mistake. You're creating a Stream inside the build
method. The build method can be run at any time -- from a screen orientation change to pushing a new route, etc.
Therefore, you should not be creating Streams inside the build method. If you do, the StreamBuilder will do the following:
onCancel
handler)You have two options to fix this:
initState
, e.g _myStream = createTheStream()
and use that in the build method.Bloc
returns the same Stream every time you request it.@brianegan
Thanks your reply, but not working. ^_^
It could be something else cause this problem.
@brianegan
I write a simple demo to reappear this problem today.
_bloc.getPageData("Play”)
is implemented by share()
.
The ouput:
I/flutter ( 6457): onData1: Instance of 'StateNoTerm<dynamic>'
I/flutter ( 6457): onData2: Instance of 'StateNoTerm<dynamic>'
I/flutter ( 6457): onData1: Instance of 'StateLoading<dynamic>'
I/flutter ( 6457): onData2: Instance of 'StateLoading<dynamic>'
I/flutter ( 6457): onData1: StatePopulated@699752661{result: Response@750916912{info: 1234567 Play}}
I/flutter ( 6457): onData2: StatePopulated@699752661{result: Response@750916912{info: 1234567 Play}}
I/flutter ( 6457): onClik: 1 //<-------------
I/flutter ( 6457): onDone3
Question:
When i click a btn, it will cancel two existed Stream.
_subscription1.cancel();
_subscription2.cancel();
but onDone1
and onDone2
was not printed at this moment. Then StreamSubscription subscription3 = _bloc.getPageData("Play”)
_subscription1.cancel();
_subscription2.cancel();
StreamSubscription subscription3 = _bloc.getPageData("Play")
.listen(
(resultState) {
print("onData3: ${resultState}");
},
onError: (error) {
print("onError3: ${error}");
},
onDone: () {
print("onDone3");
},
cancelOnError: true);
onDone3
was printed!
Why the onDone1 onDone2
didnot be printed until _subscription1 _subscription2 cancel
?
Why the onDone
event was triggered at the third time listening of the share Stream?
why onDone
called until all StreamSubscription.cancel
, but ouput onDone
until subscribe again after StreamSubscription.cancel
?
answer: https://github.com/dart-lang/sdk/issues/9026
How to cache data for ervery page widget in the pageview of flutter that didnot keep alive
?
answer
using shareReplay(1)
to instead of share()
.
Hello dev:
I have a bloc for flutter app below:
And i use
_bloc.getPageData
in a page ofPageView
like below:And console output below after the
_CatalogTabPageState dispose and re-initState everytime
.Question:
The code above will call
doOnCancel ()
afterinitState()
andbuild(BuildContext)
everytime when i jumpTo a new page? That make a new page did not have any result data to display becausestream was canceled
.