Flutter 使用blocbuilder检查bloc状态

Flutter 使用blocbuilder检查bloc状态,flutter,dart,bloc,Flutter,Dart,Bloc,我正在从API获取一个项目列表,并使用BlocBuilder构建它们。它可以工作,并且小部件列表已经建立,但是当我打印出来检查状态的哪一部分正在执行时,我得到如下所示的结果。为什么“什么都没有”出现 ProductInitial fetching product //from bloc when fetching api Nothing fetching complete //from bloc after fetching api ProductSuccess Main void main(

我正在从API获取一个项目列表,并使用BlocBuilder构建它们。它可以工作,并且小部件列表已经建立,但是当我打印出来检查状态的哪一部分正在执行时,我得到如下所示的结果。为什么“什么都没有”出现

ProductInitial
fetching product //from bloc when fetching api
Nothing
fetching complete //from bloc after fetching api
ProductSuccess
Main

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiBlocProvider(
        providers: [
          BlocProvider<ProductBloc>(
            create: (BuildContext context) => ProductBloc()..add(FetchProduct())
          ),
        ],
        child: MaterialApp(
          debugShowCheckedModeBanner: false,
          home: MainScreen(),
        )
      );
  }
}
Widget build(BuildContext context) {
    return Container(
      child: Padding(
        padding: EdgeInsets.all(10.0),
        child: BlocBuilder<ProductBloc, ProductState>(
          builder: (context, state) {
            if(state is ProductInitial){
              print('ProductInitial');
              return buildLoadingWidget();
            }
            if(state is ProductSuccess){
              print('ProductSuccess');
              return _buildProductListWidget(state.products);
            }
            if(state is ProductFailed){
              print('ProductFailed');
              return Center(
                child: Text('Something went wrong'),
              );
            }
            print('Nothing');
            return buildLoadingWidget();
          }
        )
      )
    );
  }
  Widget build(BuildContext context) {
        return Container(
          child: Padding(
            padding: EdgeInsets.all(10.0),
            child: BlocBuilder<ProductBloc, ProductState>(
              builder: (context, state) {
                if(state is ProductInitial){
                  print('ProductInitial');
                  return buildLoadingWidget();
                }
                if(state is ProductLoading){
                  print('ProductLoading');
                  return buildLoadingWidget();
                }
                if(state is ProductSuccess){
                  print('ProductSuccess');
                  return _buildProductListWidget(state.products);
                }
                if(state is ProductFailed){
                  print('ProductFailed');
                  return Center(
                    child: Text('Something went wrong'),
                  );
                }
                print('Nothing');
                return buildLoadingWidget();
              }
            )
          )
        );
      }
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回多BlocProvider(
供应商:[
BlocProvider(
create:(BuildContext上下文)=>ProductBloc()…添加(FetchProduct())
),
],
孩子:MaterialApp(
debugShowCheckedModeBanner:false,
主屏幕:主屏幕(),
)
);
}
}
列表屏幕

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiBlocProvider(
        providers: [
          BlocProvider<ProductBloc>(
            create: (BuildContext context) => ProductBloc()..add(FetchProduct())
          ),
        ],
        child: MaterialApp(
          debugShowCheckedModeBanner: false,
          home: MainScreen(),
        )
      );
  }
}
Widget build(BuildContext context) {
    return Container(
      child: Padding(
        padding: EdgeInsets.all(10.0),
        child: BlocBuilder<ProductBloc, ProductState>(
          builder: (context, state) {
            if(state is ProductInitial){
              print('ProductInitial');
              return buildLoadingWidget();
            }
            if(state is ProductSuccess){
              print('ProductSuccess');
              return _buildProductListWidget(state.products);
            }
            if(state is ProductFailed){
              print('ProductFailed');
              return Center(
                child: Text('Something went wrong'),
              );
            }
            print('Nothing');
            return buildLoadingWidget();
          }
        )
      )
    );
  }
  Widget build(BuildContext context) {
        return Container(
          child: Padding(
            padding: EdgeInsets.all(10.0),
            child: BlocBuilder<ProductBloc, ProductState>(
              builder: (context, state) {
                if(state is ProductInitial){
                  print('ProductInitial');
                  return buildLoadingWidget();
                }
                if(state is ProductLoading){
                  print('ProductLoading');
                  return buildLoadingWidget();
                }
                if(state is ProductSuccess){
                  print('ProductSuccess');
                  return _buildProductListWidget(state.products);
                }
                if(state is ProductFailed){
                  print('ProductFailed');
                  return Center(
                    child: Text('Something went wrong'),
                  );
                }
                print('Nothing');
                return buildLoadingWidget();
              }
            )
          )
        );
      }
小部件构建(构建上下文){
返回容器(
孩子:填充(
填充:所有边缘设置(10.0),
孩子:BlocBuilder(
生成器:(上下文、状态){
如果(状态为ProductInitial){
打印(“ProductInitial”);
返回buildLoadingWidget();
}
如果(状态为ProductSuccess){
打印(“ProductSuccess”);
return\u buildProductListWidget(state.products);
}
如果(状态为ProductFailed){
打印('ProductFailed');
返回中心(
孩子:文本(“出了问题”),
);
}
打印(“无”);
返回buildLoadingWidget();
}
)
)
);
}
更新

添加了集团代码以供参考

集团

class ProductBloc extends Bloc<ProductEvent, ProductState> {
  ProductBloc() : super(ProductInitial());

  ProductRepository _repository = ProductRepository();

  @override
  Stream<ProductState> mapEventToState(ProductEvent event,) async* {
    
    if(event is FetchProduct){
      yield ProductLoading();
      try{
        print('fetching product');
        final List<ProductModel> products = await _repository.getProducts();
        yield ProductSuccess(products);
        print('fetching complete');
      }catch(e){
        yield ProductFailed();
        print(e);
        print('fetching failed');
      }
    }

  }
}
class ProductBloc扩展了Bloc{
ProductBloc():super(ProductInitial());
ProductRepository_repository=ProductRepository();
@凌驾
流mapEventToState(ProductEvent事件)异步*{
if(事件为FetchProduct){
屈服载荷();
试一试{
打印(“提取产品”);
最终产品列表=wait_repository.getProducts();
生产成功(产品);
打印(“获取完成”);
}捕获(e){
失败();
印刷品(e);
打印(“获取失败”);
}
}
}
}

使用以下代码更新您的集团:

集团

class ProductBloc extends Bloc<ProductEvent, ProductState> {
ProductBloc() : super(ProductInitial());
   
 ProductRepository _repository = ProductRepository();

  @override
  Stream<ProductState> mapEventToState(ProductEvent event,) async* {
    
    if(event is FetchProduct){
      yield ProductInitial();
      try{
        print('fetching product');
        final List<ProductModel> products = await _repository.getProducts();
        yield ProductSuccess(products);
        print('fetching complete');
      }catch(e){
        yield ProductFailed();
        print(e);
        print('fetching failed');
      }
    }
  }
}

你能分享你的事件、州和集团吗?简而言之:
什么都没有出现,因为您错过了一个可能的状态,即您正在从bloc屈服。如果您使用另一条if语句捕获该状态,则不会看到任何内容。请参阅更新。谢谢@Mahdi Jafareyeyou正在捕获所有状态,但没有捕获正在侦听新状态的
blocBuilder中的
ProductLoading
状态。如果(状态为ProductLoading),只需添加一个
并处理它,那么
将不会打印任何内容,因为您正在捕获所有状态。@stalwart1014如果这对您不起作用,请告诉我。我想没有必要生成
ProductInitial()
第一次,因为bloc自己会处理它。@Mahdi Jafaree是的,这就是为什么我添加了两个选项来纠正这个问题。