Flutter中使用freezed与bloc获取API数据后无法渲染UI的问题
问题解决:Flutter Bloc+Freezed数据已获取但UI不渲染
核心问题出在UsersBloc未正确发送状态更新——你只是创建了状态对象,但没有通过emit()函数将状态传递给Bloc的状态流,导致UI的BlocBuilder无法感知到状态变化,始终停留在初始的loading状态。
修正后的UsersBloc代码
class UsersBloc extends Bloc<UsersEvent, UsersState> { final Repository repository; UsersBloc(this.repository) : super(const UsersState.loading()) { on<UsersEvent>( (event, emit) async { if (event is UsersAllEventUser) { // 发送loading状态 emit(const UsersState.loading()); try { final List<Users>? users = await repository.getUsers(); // 发送数据状态,将获取到的用户列表传递出去 emit(UsersState.data(users ?? [])); print(UsersState.data(users ?? [])); } catch (e) { // 发送错误状态 emit(const UsersState.error()); } } }, ); } }
额外检查点
- 确认UI页面已通过
BlocProvider正确注入UsersBloc,示例:BlocProvider( create: (context) => UsersBloc(Repository()), child: YourUsersPage(), ) - 确保已触发获取用户的事件,比如在页面的
initState中:@override void initState() { super.initState(); BlocProvider.of<UsersBloc>(context).add(UsersEvent.getUsers()); } - 验证Repository的
getUsers()方法确实返回了非空且有效的用户列表(可通过打印users长度确认)
内容的提问来源于stack exchange,提问作者user16357470
相关产品推荐
相关产品推荐

