Multiple StreamBuilder inside ListView failed to listen to the same Stream












0















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?










share|improve this question

























  • 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


















0















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?










share|improve this question

























  • 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
















0












0








0








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?










share|improve this question
















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 flutter rxdart bloc






share|improve this question















share|improve this question













share|improve this question




share|improve this question








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





















  • 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














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
});


}
});














draft saved

draft discarded


















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
















draft saved

draft discarded




















































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.




draft saved


draft discarded














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





















































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







Popular posts from this blog

Mossoró

Error while reading .h5 file using the rhdf5 package in R

Pushsharp Apns notification error: 'InvalidToken'