简体   繁体   English

在 flutter_bloc 中调用异步事件

[英]Calling async event in flutter_bloc

I am trying to fetch data from API as soon as the flutter app loads but I am unable to achieve so我试图在 flutter 应用程序加载后立即从 API 获取数据,但我无法实现

class MarketBloc extends Bloc<MarketListEvent, MarketListState> {
  MarketBloc() : super(MarketLoading()) {
    on<MarketSelectEvent>((event, emit) async {
      emit(MarketLoading());
      final data = await ApiCall().getData(event.value!);
      globalData = data;
      emit(MarketDataFetched(marDat: globalData.data, dealType: event.value));
    });

    
  }
}

I have called MarketLoading state as the initial state and I want to call MarketSelectEvent just after that but in the current code, action is required to do so and i want to achieve it without any action.我已将 MarketLoading state 称为初始 state,我想在此之后调用 MarketSelectEvent,但在当前代码中,需要采取行动才能做到这一点,我想在不采取任何行动的情况下实现它。

You have 2 options:您有 2 个选择:

add an event from the UI as soon you instantiate the MarketBloc实例化 MarketBloc 后立即从 UI 添加事件

  MarketBloc()..add(MarketSelectEvent())

add an event in the initialization code在初始化代码中添加一个事件

  MarketBloc() : super(MarketLoading()) {  
    add(MarketSelectEvent());
  }

You could do this with in the initState of whatever the first page is that your app loads.您可以在应用加载的第一页的initState中执行此操作。

class TestPage extends StatefulWidget {
  @override
  State<TestPage> createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
  late MarketBloc marketBloc;

  @override
  void initState() {
    super.initState();
    marketBloc = BlocProvider.of<MarketBloc>(context);
    marketBloc.add(MarketSelectEvent());
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: BlocBuilder<MarketBloc, MarketListState>(
          builder: (context, state) {
            if (state is MarketLoading) {
              return Text('loading...');
            }
            if (state is MarketDataFetched) {
              return ...your UI that contains data from API call
            }
          },
        ),
      ),
    );
  }
}


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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM