Flutter Bloc中SwipeLoaded/SwipeLoading状态判断异常问题
SwipeLoading与SwipeLoaded状态判断异常修复
问题表现
- 单独编写SwipeLoaded分支判断逻辑时,程序永远进入else分支
- 加入SwipeLoading分支判断后,程序一直停留在加载状态,无法进入SwipeLoaded分支
根本原因
核心错误出在SwipeBloc的事件处理逻辑:
_onLoadUsers方法中,从数据库获取到用户列表后,触发UpdateHome状态更新的代码被注释,导致数据加载完成后Bloc始终停留在初始化的SwipeLoading状态,永远不会切换到SwipeLoadedvoid _onLoadUsers( LoadUsers event, Emitter<SwipeState> emit, ) { _databaseRepository.getUser(event.userId).listen((users) { print('$users'); // 👇 关键状态触发代码被注释,数据加载完没有通知Bloc更新状态 // add(UpdateHome(users: users)); }); }- 左右滑动事件处理存在冗余逻辑:重复判断状态、重复执行用户移除和状态发送操作,多余的try-catch块会吞掉所有运行时报错,同名变量遮蔽容易引发逻辑错误,导致滑动后状态更新异常。
- 前端BlocBuilder中存在大量没有挂载到组件树的无效调试代码(比如单独写的
const Text("swipeloading")、const Text("SwipeLoaded")),不会生效还会干扰代码可读性。
修复方案
1. 修复数据加载后的状态触发逻辑
取消UpdateHome事件触发代码的注释,确保拿到用户数据后主动推送状态更新:
void _onLoadUsers( LoadUsers event, Emitter<SwipeState> emit, ) { _databaseRepository.getUser(event.userId).listen((users) { print('获取到用户列表:$users'); add(UpdateHome(users: users)); }); }
2. 清理滑动事件的冗余代码
移除重复判断、重复emit逻辑,修复变量名遮蔽问题:
void _onSwipeLeft( SwipeLeft event, Emitter<SwipeState> emit, ) { if (state is SwipeLoaded) { final currentState = state as SwipeLoaded; List<User> updatedUsers = List.from(currentState.users)..remove(event.user); updatedUsers.isNotEmpty ? emit(SwipeLoaded(users: updatedUsers)) : emit(SwipeError()); } } void _onSwipeRight( SwipeRight event, Emitter<SwipeState> emit, ) { if (state is SwipeLoaded) { final currentState = state as SwipeLoaded; List<User> updatedUsers = List.from(currentState.users)..remove(event.user); updatedUsers.isNotEmpty ? emit(SwipeLoaded(users: updatedUsers)) : emit(SwipeError()); } }
3. 清理前端无效代码
删除BlocBuilder中没有挂载到组件树的冗余Text组件,保持判断逻辑简洁。
验证逻辑
修复后执行流程如下:
- 用户认证通过后,Bloc初始化状态为
SwipeLoading,前端展示加载指示器 - 数据库返回用户列表后,Bloc发送
SwipeLoaded状态,前端渲染用户卡片 - 左右滑动触发对应事件,用户列表更新后重新渲染卡片,列表为空时进入
SwipeError状态展示无更多用户提示
内容的提问来源于stack exchange,提问作者Manhr Chawla
相关产品推荐
相关产品推荐

