【发布时间】:2020-10-25 10:13:09
【问题描述】:
第一次加载页面时,我正在使用flutter_bloc 模式进行 api 调用。我在initState 中添加事件,一切正常。我也在尝试添加一个刷新按钮。我做的事情和我在initState 做的事情完全一样。但它不会触发blocBuilder 中的重建。这是表示层。
class OtherPage extends StatefulWidget {
@override
_OtherPageState createState() => _OtherPageState();
}
class _OtherPageState extends State<OtherPage> {
EngageBloc engageBloc;
int count = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: <Widget>[
IconButton(
icon: Icon(Icons.refresh),
onPressed: () {
engageBloc.add(FetchEngageEvent());
},
),
],
),
body: BlocBuilder<EngageBloc, EngageState>(builder: (context, state) {
if (state is EngageInitialState) {
return CircularProgressIndicator();
}
if (state is EngageLoadingState) {
return CircularProgressIndicator();
}
if (state is EngageLoadedState) {
final courses = state.courses;
return buildUi(courses);
}
if (state is EngageErrorState) {
return buildErrorUi(state.message);
}
return Container();
}));
}
Widget buildLoading() {
return Center(
child: CircularProgressIndicator(),
);
}
Widget buildErrorUi(String message) {
return Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
message,
style: TextStyle(color: Colors.red),
),
),
);
}
Widget buildUi(AvailableCourseBoxset courses) {
return Text('It works!!');
}
@override
void initState() {
engageBloc = BlocProvider.of<EngageBloc>(context);
engageBloc.add(FetchEngageEvent());
super.initState();
}
}
有什么明显的我做错了。当我单击刷新按钮时,会进行 api 调用。日志中没有出现错误。我正在使用跟踪状态转换的观察者。输出:
flutter: onTransition Transition { currentState: EngageLoadedState, event: FetchEngageEvent, nextState: EngageLoadingState }
flutter: onTransition Transition { currentState: EngageLoadingState, event: FetchEngageEvent, nextState: EngageLoadedState
}
EngageLoadingState 被调用,但 ui 甚至没有为此更新。正如我所说的 initState 有效,但对刷新按钮执行相同操作却没有。我很感激我可能需要添加更多代码...问一下,我会发布您的要求..谢谢。
【问题讨论】:
-
能否也分享一下bloc本身的代码
标签: flutter flutter-bloc