Flutter中initState内用Stream.firstWhere满足条件时无法跳转页面如何解决
问题根因
map转换函数无返回值:你在map回调中仅处理了数值解析和打印逻辑,没有返回解析后的整数值,导致map转换后流的所有元素均为null,firstWhere((value) => value == 2)的判定条件永远无法触发,对应的Future始终不会完成。- 未监听
firstWhere的异步结果:firstWhere返回的是异步Future,你没有通过.then()或await监听其完成状态,即使条件满足也无法触发后续逻辑。且你将跳转逻辑写在map回调中,会导致每次流有事件就触发跳转,和firstWhere的判定逻辑完全脱离。 - 基础代码疏漏:原代码漏写了
initState必须调用的super.initState(),同时跳转方法名存在拼写错误。
修正后代码
initState 实现
@override void initState() { super.initState(); stream?.map((value) { final currentVal = value.toString(); final currentParsedVal = int.parse( currentVal.substring(1, currentVal.length - 1), onError: (source) => -1, ); print("String $currentParsedVal"); // 返回解析后的值供firstWhere判定 return currentParsedVal; })?.firstWhere((value) => value == 2) .then((_) { // 仅条件满足时执行跳转 WidgetsBinding.instance.addPostFrameCallback((_) => SeizureAlert()); }) // 可选:添加异常捕获,避免流提前关闭抛出的StateError .catchError((error) { print("流监听结束:$error"); }); }
跳转方法实现
void SeizureAlert() { Navigator.pushAndRemoveUntil( context, MaterialPageRoute( builder: (context) => TriggeringAlert(device: widget.device), ), (route) => false, ); }
额外注意事项
- 页面销毁前需处理流的取消监听,避免内存泄漏和失效上下文调用报错
- 方法名建议遵循Dart小驼峰规范,可修改为
seizureAlert
内容的提问来源于stack exchange,提问作者Nabia Salman
相关产品推荐
相关产品推荐

