You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 01:45:06