简体   繁体   English

使用 blocbuilder 检查 bloc state

[英]Checking bloc state with blocbuilder

I'm fetching a list of items from an API and building them using the BlocBuilder.我正在从 API 中获取项目列表并使用 BlocBuilder 构建它们。 It works and the widget list is built but when I print out to check which part of the state is being executed, I get as shown below.它可以工作并且构建了小部件列表,但是当我打印出来检查 state 的哪个部分正在执行时,我得到如下所示。 Why does 'Nothing' appeared?为什么会出现“无”?

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

List Screen列表屏幕

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

Update更新

Added the bloc code for reference.添加了块代码以供参考。

Bloc集团

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

  }
}

Update your bloc with the below code:使用以下代码更新您的集团:

BLOC集团

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

As in your code, you are yield ProductLoading state but didn't handle that state in your BlocBuilder that's why it bypasses all if statement and prints Nothing .在您的代码中,您正在 yield ProductLoading state 但没有在 BlocBuilder 中处理 state 这就是它绕过所有 if 语句并打印Nothing的原因。

So another way is handle ProductLoading in your block build as shown below所以另一种方法是在你的块构建中处理ProductLoading ,如下所示

List Screen列表屏幕

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 flutter_bloc BlocBuilder 没有重建,也没有在 BlocObserver 中观察到状态变化 - flutter_bloc BlocBuilder not rebuilding as well state change not observed in BlocObserver Flutter bloc:更新状态不会重新调用 BlocBuilder - Flutter bloc: updating the state does not re-call BlocBuilder BlocBuilder() 在 BLoC 产生新的 state 后未更新 - BlocBuilder() not being updated after BLoC yielding new state 何时在 BlocBuilder() 中提供一个块? - When to provide a bloc in a BlocBuilder()? flutter bloc:变量未在 BlocBuilder 中定义 - flutter bloc: variable is not defined in BlocBuilder Flutter:如果流是 Bloc 状态的一部分,如何将 StreamBuilder 与 BlocBuilder 一起使用? - Flutter: How to Use StreamBuilder With BlocBuilder in Case the Stream Is a Part of The Bloc's State? Flutter bloc:BlocBuilder 在第一次声明 state 时不会重新调用构建器方法 - Flutter bloc: BlocBuilder does not re-call builder method when stated state first time 颤振 + 块 6.0.6。 BlocBuilder 的“builder”回调与“buildWhen”回调的状态不同 - Flutter + Bloc 6.0.6. BlocBuilder's "builder" callback isn't provided with the same state as the "buildWhen" callback 我在使用 Bloc/cubit 在 flutter 的其他小部件/类中使用 BlocBuilder 获取上次发出的 state 时遇到问题 - I am having trouble getting last emitted state with BlocBuilder in other widgets/classes in flutter using Bloc/cubit 根据参数更改 BlocBuilder 的块 - Changing the bloc of a BlocBuilder depending on a parameter
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM