Flutter Flatter bloc:更新状态不会重新调用BlocBuilder

Flutter Flatter bloc:更新状态不会重新调用BlocBuilder,flutter,dart,bloc,state-management,Flutter,Dart,Bloc,State Management,我有一个页面正在使用bloc进行管理 这是home\u state.dart import 'package:banha/data/models/category.dart'; import 'package:flutter/material.dart'; abstract class HomeState { HomeState() : super(); } class HomeInitial extends HomeState {} class UpdateCats extends

我有一个页面正在使用bloc进行管理

这是
home\u state.dart

import 'package:banha/data/models/category.dart';
import 'package:flutter/material.dart';

abstract class HomeState {
  HomeState() : super();
}

class HomeInitial extends HomeState {}

class UpdateCats extends HomeState {
  final List<Category> cats;
  final int rand;
  UpdateCats({@required this.cats,@required this.rand}){
    print(this.cats);
    print(this.rand);
  }
}
和页面小部件:

import 'package:banha/ui/category/category.dart';
import 'package:banha/ui/tabs/home/bloc/home_bloc.dart';
import 'package:banha/ui/tabs/home/bloc/home_states.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

class ListingsWidget extends StatefulWidget {
  @override
  _ListingsWidgetState createState() => _ListingsWidgetState();
}

class _ListingsWidgetState extends State<ListingsWidget> {
  final HomeBloc _homeBloc = HomeBloc();

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 130,
      padding: EdgeInsets.only(top: 10, bottom: 10),
      child: BlocListener(
        bloc: _homeBloc,
        listener: (context, state) {
          print(state);
        },
        child: BlocBuilder<HomeBloc, HomeState>(
          bloc: _homeBloc,
          builder: (BuildContext context,HomeState state) {
            if(state is UpdateCats){
              print(state.cats);
            }
            return ListView(
              scrollDirection: Axis.horizontal,
              children: <Widget>[
                InkWell(
                  borderRadius: BorderRadius.circular(1000),
                  onTap: () {
                    HomeBloc().getAllCats();
//                    Navigator.push(context, CupertinoPageRoute(builder: (context) => CategoryPage()));
                  },
....

没有发生任何事情(不再调用Builder),我的代码有什么问题?

我将
BlocProvider
添加到根小部件(即主页)中,解决了这个问题。

问题在于:

...
onTap: () {
...
  HomeBloc().getAllCats();
...
},
...

它应该是
\u homeBloc.getAllCats()

我不知道为什么,但是您是否尝试过BlocDelegate来查看状态转换,如果您可以提供此日志,这将对调试非常有帮助。我刚刚发现您在代码中做了一件奇怪的事情<代码>HomeBloc().getAllCats(),则在调度事件时使用本地bloc但初始化新bloc
BlocProvider
不是真正的问题,因为您使用的是本地bloc
if(state is UpdateCats){
              print(state.cats);
            }
...
onTap: () {
...
  HomeBloc().getAllCats();
...
},
...