title: Flutter Bloc is not updating the state/ not working
body: <p>I am developing a mobile application using Flutter. I am using the flutter block package, <a href="https://pub.dev/packages/flutter_bloc" rel="noreferrer">https://pub.dev/packages/flutter_bloc</a> for managing and setting up the bloc. But when the state change it is not updating the widgets or views.</p>
  
  <p>I have a bloc class file called home_bloc.dart with the following implementation.</p>
  
  <pre><code>class HomeEvent {
    static const int FETCH_ARTICLES = 1;
    static const int TOGGLE_IS_FILTERING = 2;
    int _event = 0;
    String _filterKeyword = "";
  
    int get event =&gt; _event;
  
    void set event(int event) {
      this._event = event;
    }
  
    String get filterKeyword =&gt; _filterKeyword;
  
    void set filterKeyword(String filterKeyword) {
      this._filterKeyword = filterKeyword;
    }
  }
  
  class HomeBloc extends Bloc&lt;HomeEvent, HomeState&gt; {
    Repository _repository = Repository();
    HomeState state = HomeState();
  
    @override
    HomeState get initialState =&gt; state;
  
    @override
    Stream&lt;HomeState&gt; mapEventToState(HomeEvent event) async* {
      switch (event.event) {
        case HomeEvent.FETCH_ARTICLES:
          {
            List&lt;dynamic&gt; articles = List&lt;dynamic&gt;();
            fetchArticles(filter: event.filterKeyword).listen((dynamic article) {
              articles.add(article);
            });
            state = state.copyWith(articles: articles);
            break;
          }
        case HomeEvent.TOGGLE_IS_FILTERING:
          {
            state.isFiltering = ! state.isFiltering;
            state = state.copyWith();
            break;
          }
        default:
          {
            state = state.initial();
            break;
          }
      }
  
      yield state;
    }
  
    Stream&lt;dynamic&gt; fetchArticles({String filter = ""}) async* {
      List&lt;dynamic&gt; list = (this.state.articles.length &gt; 0)
          ? this.state.articles
          : await _repository.getArticles();
      if (filter.isNotEmpty) {
        for (var article in list) {
          if (article is String) {
            yield article;
          } else if (article.title.contains(filter)) {
            yield article;
          }
        }
      } else {
        for (var article in list) {
          yield article;
        }
      }
    }
  }
  
  class HomeState {
    bool _isFiltering = false;
    List&lt;dynamic&gt; _articles = List&lt;dynamic&gt;();
  
    bool get isFiltering =&gt; _isFiltering;
  
    void set isFiltering(bool isFiltering) {
      this._isFiltering = isFiltering;
    }
  
    List&lt;dynamic&gt; get articles =&gt; _articles;
  
    void set articles(List&lt;dynamic&gt; list) {
      this._articles = list;
    }
  
    HomeState initial() {
      HomeState state = HomeState();
      state.isFiltering = false;
      state.articles = List&lt;dynamic&gt;();
  
      return state;
    }
  
    HomeState copyWith({ bool isFiltering, List&lt;dynamic&gt; articles }) {
      HomeState state = HomeState();
      state.isFiltering = isFiltering != null? isFiltering: this._isFiltering;
      state.articles = articles!=null &amp;&amp; articles.length &gt; 0? articles: this._articles;
  
      return state;
    }
  }
  </code></pre>
  
  <p>This is my repository class returning dummy data.</p>
  
  <pre><code>class Repository {
    Future&lt;List&lt;dynamic&gt;&gt; getArticles() async {
      List&lt;dynamic&gt; list = List&lt;dynamic&gt;();
      list.add("A");
  
      Article article1 = Article();
      article1.id = 1;
      article1.title = "A start is born";
      list.add(article1);
  
      Article article2 = Article();
      article2.id = 2;
      article2.title = "Asking for help";
      list.add(article2);
  
      Article article3 = Article();
      article3.id = 3;
      article3.title = "Angel is comming";
      list.add(article3);
  
      list.add("B");
  
      Article article4 = Article();
      article4.id = 4;
      article4.title = "Baby Boss";
      list.add(article4);
  
      Article article5 = Article();
      article5.id = 5;
      article5.title = "Beginner guide to Staying at Home";
      list.add(article5);
  
      list.add("C");
  
      Article article6 = Article();
      article6.id = 6;
      article6.title = "Care each other";
      list.add(article6);
  
      Article article7 = Article();
      article7.id = 7;
      article7.title = "Controlling the world";
      list.add(article7);
  
      Article article8 = Article();
      article8.id = 8;
      article8.title = "Chasing the dream";
      list.add(article8);
  
      return list;
    }
  }
  </code></pre>
  
  <p>This is my HomePage widget</p>
  
  <pre><code>class HomePage extends StatefulWidget {
    @override
    State&lt;StatefulWidget&gt; createState() {
      return _HomePageState();
    }
  }
  
  class _HomePageState extends State&lt;HomePage&gt; {
    IconData _searchIcon = Icons.search;
    Widget _appBarTitle;
    HomeBloc _homeBloc;
  
    @override
    void initState() {
      super.initState();
      this._homeBloc = BlocProvider.of(context);
      WidgetsBinding.instance.addPostFrameCallback((_) =&gt; this.fetchArticles());
      WidgetsBinding.instance
          .addPostFrameCallback((_) =&gt; this.buildAppBarTitle());
    }
  
    @override
    Widget build(BuildContext context) {
      return BlocBuilder&lt;HomeBloc, HomeState&gt;(
        builder: (context, state) {
          return Scaffold(
            appBar: AppBar(title: Text("Home"),),
            body: Container(
              child: buildListView(context, state),
            ),
          );
        },
      );
    }
  
    @override
    void dispose() {
      super.dispose();
    }
  
    void buildAppBarTitle() {
      this.setState(() {
        if (_searchIcon == Icons.search) {
          this._appBarTitle = Text("Home");
        } else {
          this._appBarTitle = TextField(
            onChanged: (String inputValue) {
              debugPrint("Search term has changed $inputValue");
              //homeBloc.fetchArticles(filter: inputValue);
            },
            style: TextStyle(
              color: Colors.white,
            ),
            decoration: InputDecoration(
              hintText: "Search",
            ),
          );
        }
      });
    }
  
    Widget buildAppBarSearchIcon() {
      return IconButton(
          icon: Icon(
            _searchIcon,
            color: Colors.white,
          ),
          onPressed: () {
            if (this._searchIcon == Icons.search) {
              //display the search text field and close icons
  
              this.setState(() {
                this._searchIcon = Icons.close;
                this.buildAppBarTitle();
                //homeBloc.toggleFiltering();
              });
            } else {
              this.fetchArticles();
              this.setState(() {
                this._searchIcon = Icons.search;
                this.buildAppBarTitle();
                //homeBloc.toggleFiltering();
              });
            }
          });
    }
  
    Widget buildListView(
        BuildContext context, HomeState state) {
      if (state.articles.length &gt; 0) {
        var listView = ListView.builder(
            itemCount: state.articles.length,
            itemBuilder: (context, index) {
              var item = state.articles[index];
  
              if (item is String) {
                return buildListFirstInitialView(item);
              }
  
              Article article = item as Article;
  
              return buildListArticleView(article);
            });
  
        return listView;
      } else {
        return Center(
          child: Text("No resources found."),
        );
      }
    }
  
    Widget buildListFirstInitialView(String initial) {
      return ListTile(
        title: Text(initial),
      );
    }
  
    Widget buildListArticleView(Article article) {
      return ListTile(
        title: Text(article.title),
      );
    }
  
    Widget buildBottomNavigationBar() {
      return BottomNavigationBar(
          currentIndex: 0,
          onTap: (int position) {},
          items: [
            BottomNavigationBarItem(
              icon: Icon(Icons.home),
              title: Text('Home'),
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.settings),
              title: Text('Settings'),
            ),
          ]);
    }
  
    void fetchArticles({String filter = ""}) {
      HomeEvent event = HomeEvent();
      event.event = HomeEvent.FETCH_ARTICLES;
      _homeBloc.add(event);
    }
  }
  </code></pre>
  
  <p>As you can see this is my HomePage widget is doing. It will fetch the articles after the widget is built. Then the list view will be updated with the dummy data.</p>
  
  <p>This is my main.dart file.</p>
  
  <pre><code>void main() =&gt; runApp(MyApp());
  
  class MyApp extends StatelessWidget {
    // This widget is the root of your application.
    @override
    Widget build(BuildContext context) {
      return MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Flutter Demo',
        theme: ThemeData(
          // This is the theme of your application.
          //
          // Try running your application with "flutter run". You'll see the
          // application has a blue toolbar. Then, without quitting the app, try
          // changing the primarySwatch below to Colors.green and then invoke
          // "hot reload" (press "r" in the console where you ran "flutter run",
          // or simply save your changes to "hot reload" in a Flutter IDE).
          // Notice that the counter didn't reset back to zero; the application
          // is not restarted.
          primarySwatch: Colors.blue,
        ),
        home: BlocProvider(
          create: (context) =&gt; HomeBloc(),
          child: HomePage(),
        ),
      );
    }
  }
  </code></pre>
  
  <p>When I run my app, it is not updating the list view with the dummy data. Instead, it is always showing the message for no records found.</p>
  
  <p><a href="https://i.stack.imgur.com/A6OBS.png" rel="noreferrer"><img src="https://i.stack.imgur.com/A6OBS.png" alt="enter image description here"></a> </p>
  
  <p>Why is it not working?</p>