0

Good day everyone, I'm using Flutter with bloc and I'm trying to show a list of Channels which you can "Follow" o "Unfollow".

I have a custom ChannelContainer Widget that loads a list with channel titles and a custom widget JoinButton which shows whether the user can "Follow/Unfollow" depending on the state (If the channel is already being followed or not).

  Widget _getChannelsList() {
    List<Post> channelList = ContentService().getAllChannels();
    return ListView.separated(
      itemBuilder: (_, i) => ChannelContainer(
          title: channelList[i].title,
          description: channelList[i].description,
          idChannel: channelList[i].id),
      separatorBuilder: (_, i) => SizedBox(height: 5.0),
      itemCount: channelList.length,
    );
  }

This is my custom JoinButton Widget:

    @override
  Widget build(BuildContext context) {
    final channelBloc = BlocProvider.of<ChannelBloc>(context);
    channelBloc.add(GetJoinStatus(idChannel));

    return Container(
      child: BlocBuilder<ChannelBloc, ChannelState>(builder: (context, state) {
        var userIsJoined = state.userIsJoined;
        if (userIsJoined) {
          return ElevatedButton(
            child: Text('Unfollow'),
            onPressed: () {},
          );
        } else {
          return ElevatedButton(
            child: Text('Follow'),
            onPressed: () {},
          );
        }
      }),
    );
  }

I made a test checking the idChannel and returning true to even numbers and false to odd ones and thought that as I was creating multiple JoinButtons, each one would keep their state (followed or not) but as I'm firing the GetJoinStatus() event each time a JoinButton is instantiated and the state changes all the buttons get rebuilded and get the same state.

So, at the end I have a list of JoinButtons that are all getting just Follow or Unfollow but not mixed results.

What would be the best way to get the expected result? I've tried a lot of things that could work but anything compatible with bloc workflow... Thank you in advance!

Juli15
  • 411
  • 7
  • 17

1 Answers1

0

I think the best way to do this is to have a map in your bloc state whose key is the channel id and the value is a boolean true if joined and false if not.

Luis Utrera
  • 942
  • 6
  • 15