在 flutter_bloc 中调用异步事件
Calling async event in flutter_bloc
我试图在 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));
});
}
}
我已将 MarketLoading 状态称为初始状态,我想在此之后立即调用 MarketSelectEvent,但在当前代码中,需要采取行动才能做到这一点,我想在不采取任何行动的情况下实现它。
您可以在应用程序加载的第一页的 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
}
},
),
),
);
}
}
您有 2 个选择:
在实例化 MarketBloc
后立即从 UI 添加一个事件
MarketBloc()..add(MarketSelectEvent())
在初始化代码中添加一个事件
MarketBloc() : super(MarketLoading()) {
add(MarketSelectEvent());
}
我试图在 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));
});
}
}
我已将 MarketLoading 状态称为初始状态,我想在此之后立即调用 MarketSelectEvent,但在当前代码中,需要采取行动才能做到这一点,我想在不采取任何行动的情况下实现它。
您可以在应用程序加载的第一页的 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
}
},
),
),
);
}
}
您有 2 个选择:
在实例化 MarketBloc
后立即从 UI 添加一个事件 MarketBloc()..add(MarketSelectEvent())
在初始化代码中添加一个事件
MarketBloc() : super(MarketLoading()) {
add(MarketSelectEvent());
}