Multiple StreamBuilder inside ListView failed to listen to the same Stream
I have 2 StreamBuilder inside ListView that listen to the same Stream, that is valueStream. Inside that StreamBuilder, I have SwitchListTile that add new value to valueStream.
This is my Stream:
Observable<bool> get valueStream => valueController.stream;
This is my ListView:
ListView(
children: <Widget>[
Switch1(key: UniqueKey(),),
Switch2(key: UniqueKey(),),
],
),
This is Switch1 widget:
class Switch1 extends StatefulWidget {
const Switch1(
{@required Key key})
: super(key: key);
@override
_Switch1State createState() => _Switch1State();
}
class _Switch1State extends State<Switch1> {
DummyBloc _dummyBloc;
@override
Widget build(BuildContext context) {
return StreamBuilder(
key: UniqueKey(),
stream: _dummyBloc.valueStream,
builder: (context, AsyncSnapshot<bool> snapshot) {
print('rebuild Switch1');
if(!snapshot.hasData) return Container();
return SwitchListTile(
value: snapshot.data,
onChanged: _dummyBloc.updateValue,
);
},
);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
_dummyBloc = DummyBloc();
}
}
This is Switch2 widget:
class Switch2 extends StatefulWidget {
const Switch2(
{@required Key key})
: super(key: key);
@override
_Switch2State createState() => _Switch2State();
}
class _Switch2State extends State<Switch2> {
DummyBloc _dummyBloc;
@override
Widget build(BuildContext context) {
return StreamBuilder(
key: UniqueKey(),
stream: _dummyBloc.valueStream,
builder: (context, AsyncSnapshot<bool> snapshot) {
print('rebuild Switch2');
if(!snapshot.hasData) return Container();
return SwitchListTile(
activeColor: Theme.of(context).buttonColor,
value: snapshot.data,
onChanged: _dummyBloc.updateValue,
);
},
);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
_dummyBloc = DummyBloc();
}
}
If I touch the Switch1 widget, the StreamBuilder inside Switch2 supposedly rebuild, and vice versa, but that didn't happen. I tried to add UniqueKey to Switch1 and Switch2, but that doesn't help. Any suggestion how to make this work?
dart
add a comment |
I have 2 StreamBuilder inside ListView that listen to the same Stream, that is valueStream. Inside that StreamBuilder, I have SwitchListTile that add new value to valueStream.
This is my Stream:
Observable<bool> get valueStream => valueController.stream;
This is my ListView:
ListView(
children: <Widget>[
Switch1(key: UniqueKey(),),
Switch2(key: UniqueKey(),),
],
),
This is Switch1 widget:
class Switch1 extends StatefulWidget {
const Switch1(
{@required Key key})
: super(key: key);
@override
_Switch1State createState() => _Switch1State();
}
class _Switch1State extends State<Switch1> {
DummyBloc _dummyBloc;
@override
Widget build(BuildContext context) {
return StreamBuilder(
key: UniqueKey(),
stream: _dummyBloc.valueStream,
builder: (context, AsyncSnapshot<bool> snapshot) {
print('rebuild Switch1');
if(!snapshot.hasData) return Container();
return SwitchListTile(
value: snapshot.data,
onChanged: _dummyBloc.updateValue,
);
},
);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
_dummyBloc = DummyBloc();
}
}
This is Switch2 widget:
class Switch2 extends StatefulWidget {
const Switch2(
{@required Key key})
: super(key: key);
@override
_Switch2State createState() => _Switch2State();
}
class _Switch2State extends State<Switch2> {
DummyBloc _dummyBloc;
@override
Widget build(BuildContext context) {
return StreamBuilder(
key: UniqueKey(),
stream: _dummyBloc.valueStream,
builder: (context, AsyncSnapshot<bool> snapshot) {
print('rebuild Switch2');
if(!snapshot.hasData) return Container();
return SwitchListTile(
activeColor: Theme.of(context).buttonColor,
value: snapshot.data,
onChanged: _dummyBloc.updateValue,
);
},
);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
_dummyBloc = DummyBloc();
}
}
If I touch the Switch1 widget, the StreamBuilder inside Switch2 supposedly rebuild, and vice versa, but that didn't happen. I tried to add UniqueKey to Switch1 and Switch2, but that doesn't help. Any suggestion how to make this work?
dart
Each switch has its own instance of DummyBloc when I think you'd want them to share the same DummyBloc object.
– Jordan Davies
Jan 2 at 9:25
You are not listening to the same stream , instead you are listening to different instance of streams in both widgets because you are creating new instance of bloc in the widget and just a disclaimer do not create instances in the didChangeDependecies()
– Ajay Beniwal
Jan 2 at 9:59
Whoops, you're right, this is how I suppose to create the dummyBloc _dummyBloc = BlocProvider.of(context).dummyBloc; Where do you think I have to create DummyBloc inside the Widget? I use this repo as my reference to my BLOC pattern: github.com/shiang/flutter-form-with-validation-BLOC
– firmansyah ramadhan
Jan 2 at 10:08
add a comment |
I have 2 StreamBuilder inside ListView that listen to the same Stream, that is valueStream. Inside that StreamBuilder, I have SwitchListTile that add new value to valueStream.
This is my Stream:
Observable<bool> get valueStream => valueController.stream;
This is my ListView:
ListView(
children: <Widget>[
Switch1(key: UniqueKey(),),
Switch2(key: UniqueKey(),),
],
),
This is Switch1 widget:
class Switch1 extends StatefulWidget {
const Switch1(
{@required Key key})
: super(key: key);
@override
_Switch1State createState() => _Switch1State();
}
class _Switch1State extends State<Switch1> {
DummyBloc _dummyBloc;
@override
Widget build(BuildContext context) {
return StreamBuilder(
key: UniqueKey(),
stream: _dummyBloc.valueStream,
builder: (context, AsyncSnapshot<bool> snapshot) {
print('rebuild Switch1');
if(!snapshot.hasData) return Container();
return SwitchListTile(
value: snapshot.data,
onChanged: _dummyBloc.updateValue,
);
},
);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
_dummyBloc = DummyBloc();
}
}
This is Switch2 widget:
class Switch2 extends StatefulWidget {
const Switch2(
{@required Key key})
: super(key: key);
@override
_Switch2State createState() => _Switch2State();
}
class _Switch2State extends State<Switch2> {
DummyBloc _dummyBloc;
@override
Widget build(BuildContext context) {
return StreamBuilder(
key: UniqueKey(),
stream: _dummyBloc.valueStream,
builder: (context, AsyncSnapshot<bool> snapshot) {
print('rebuild Switch2');
if(!snapshot.hasData) return Container();
return SwitchListTile(
activeColor: Theme.of(context).buttonColor,
value: snapshot.data,
onChanged: _dummyBloc.updateValue,
);
},
);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
_dummyBloc = DummyBloc();
}
}
If I touch the Switch1 widget, the StreamBuilder inside Switch2 supposedly rebuild, and vice versa, but that didn't happen. I tried to add UniqueKey to Switch1 and Switch2, but that doesn't help. Any suggestion how to make this work?
dart
I have 2 StreamBuilder inside ListView that listen to the same Stream, that is valueStream. Inside that StreamBuilder, I have SwitchListTile that add new value to valueStream.
This is my Stream:
Observable<bool> get valueStream => valueController.stream;
This is my ListView:
ListView(
children: <Widget>[
Switch1(key: UniqueKey(),),
Switch2(key: UniqueKey(),),
],
),
This is Switch1 widget:
class Switch1 extends StatefulWidget {
const Switch1(
{@required Key key})
: super(key: key);
@override
_Switch1State createState() => _Switch1State();
}
class _Switch1State extends State<Switch1> {
DummyBloc _dummyBloc;
@override
Widget build(BuildContext context) {
return StreamBuilder(
key: UniqueKey(),
stream: _dummyBloc.valueStream,
builder: (context, AsyncSnapshot<bool> snapshot) {
print('rebuild Switch1');
if(!snapshot.hasData) return Container();
return SwitchListTile(
value: snapshot.data,
onChanged: _dummyBloc.updateValue,
);
},
);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
_dummyBloc = DummyBloc();
}
}
This is Switch2 widget:
class Switch2 extends StatefulWidget {
const Switch2(
{@required Key key})
: super(key: key);
@override
_Switch2State createState() => _Switch2State();
}
class _Switch2State extends State<Switch2> {
DummyBloc _dummyBloc;
@override
Widget build(BuildContext context) {
return StreamBuilder(
key: UniqueKey(),
stream: _dummyBloc.valueStream,
builder: (context, AsyncSnapshot<bool> snapshot) {
print('rebuild Switch2');
if(!snapshot.hasData) return Container();
return SwitchListTile(
activeColor: Theme.of(context).buttonColor,
value: snapshot.data,
onChanged: _dummyBloc.updateValue,
);
},
);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
_dummyBloc = DummyBloc();
}
}
If I touch the Switch1 widget, the StreamBuilder inside Switch2 supposedly rebuild, and vice versa, but that didn't happen. I tried to add UniqueKey to Switch1 and Switch2, but that doesn't help. Any suggestion how to make this work?
dart
dart
edited Jan 2 at 9:19
firmansyah ramadhan
asked Jan 2 at 9:11
firmansyah ramadhanfirmansyah ramadhan
11
11
Each switch has its own instance of DummyBloc when I think you'd want them to share the same DummyBloc object.
– Jordan Davies
Jan 2 at 9:25
You are not listening to the same stream , instead you are listening to different instance of streams in both widgets because you are creating new instance of bloc in the widget and just a disclaimer do not create instances in the didChangeDependecies()
– Ajay Beniwal
Jan 2 at 9:59
Whoops, you're right, this is how I suppose to create the dummyBloc _dummyBloc = BlocProvider.of(context).dummyBloc; Where do you think I have to create DummyBloc inside the Widget? I use this repo as my reference to my BLOC pattern: github.com/shiang/flutter-form-with-validation-BLOC
– firmansyah ramadhan
Jan 2 at 10:08
add a comment |
Each switch has its own instance of DummyBloc when I think you'd want them to share the same DummyBloc object.
– Jordan Davies
Jan 2 at 9:25
You are not listening to the same stream , instead you are listening to different instance of streams in both widgets because you are creating new instance of bloc in the widget and just a disclaimer do not create instances in the didChangeDependecies()
– Ajay Beniwal
Jan 2 at 9:59
Whoops, you're right, this is how I suppose to create the dummyBloc _dummyBloc = BlocProvider.of(context).dummyBloc; Where do you think I have to create DummyBloc inside the Widget? I use this repo as my reference to my BLOC pattern: github.com/shiang/flutter-form-with-validation-BLOC
– firmansyah ramadhan
Jan 2 at 10:08
Each switch has its own instance of DummyBloc when I think you'd want them to share the same DummyBloc object.
– Jordan Davies
Jan 2 at 9:25
Each switch has its own instance of DummyBloc when I think you'd want them to share the same DummyBloc object.
– Jordan Davies
Jan 2 at 9:25
You are not listening to the same stream , instead you are listening to different instance of streams in both widgets because you are creating new instance of bloc in the widget and just a disclaimer do not create instances in the didChangeDependecies()
– Ajay Beniwal
Jan 2 at 9:59
You are not listening to the same stream , instead you are listening to different instance of streams in both widgets because you are creating new instance of bloc in the widget and just a disclaimer do not create instances in the didChangeDependecies()
– Ajay Beniwal
Jan 2 at 9:59
Whoops, you're right, this is how I suppose to create the dummyBloc _dummyBloc = BlocProvider.of(context).dummyBloc; Where do you think I have to create DummyBloc inside the Widget? I use this repo as my reference to my BLOC pattern: github.com/shiang/flutter-form-with-validation-BLOC
– firmansyah ramadhan
Jan 2 at 10:08
Whoops, you're right, this is how I suppose to create the dummyBloc _dummyBloc = BlocProvider.of(context).dummyBloc; Where do you think I have to create DummyBloc inside the Widget? I use this repo as my reference to my BLOC pattern: github.com/shiang/flutter-form-with-validation-BLOC
– firmansyah ramadhan
Jan 2 at 10:08
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54003725%2fmultiple-streambuilder-inside-listview-failed-to-listen-to-the-same-stream%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54003725%2fmultiple-streambuilder-inside-listview-failed-to-listen-to-the-same-stream%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Each switch has its own instance of DummyBloc when I think you'd want them to share the same DummyBloc object.
– Jordan Davies
Jan 2 at 9:25
You are not listening to the same stream , instead you are listening to different instance of streams in both widgets because you are creating new instance of bloc in the widget and just a disclaimer do not create instances in the didChangeDependecies()
– Ajay Beniwal
Jan 2 at 9:59
Whoops, you're right, this is how I suppose to create the dummyBloc _dummyBloc = BlocProvider.of(context).dummyBloc; Where do you think I have to create DummyBloc inside the Widget? I use this repo as my reference to my BLOC pattern: github.com/shiang/flutter-form-with-validation-BLOC
– firmansyah ramadhan
Jan 2 at 10:08