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

StreamBuilder实时拉取赛事比分时出现Stream类型不允许返回空值报错

问题根因
  • Instance of Future 显示异常:getCricketScoreApi 是异步方法,返回值为Future类型,你直接将该方法作为Stream.periodic的回调返回值,导致流发出的是未执行的Future实例而非实际接口返回的比分数据,调用toString()后就会显示Instance of Future。
  • Stream非空报错:一方面你未给getCricketScoreApi、streamScore方法声明明确的返回类型,且接口请求失败分支返回了print方法的执行结果(print返回值为void,对应null),不符合Stream不允许空返回的要求;另一方面未处理接口请求抛出的异常场景,会导致流发出空值。
修复代码
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

class Match extends StatefulWidget {
  @override
  State<Match> createState() => _MatchState();
}

class _MatchState extends State<Match> {
  // 明确声明返回类型,请求失败也返回非空的错误提示字符串
  Future<String> getCricketScoreApi() async {
    const apiUrl = "你的接口地址"; // 替换为实际的api地址
    var url = Uri.parse(apiUrl);
    try {
      var response = await http.get(url);
      if (response.statusCode == 200) {
        final score = jsonDecode(response.body);
        return score['cricket_score'].toString();
      } else {
        return "请求失败:状态码${response.statusCode}";
      }
    } catch (e) {
      return "请求异常:$e";
    }
  }

  // 用async*生成流,await异步请求结果后再发出,明确泛型为String
  Stream<String> streamScore() async* {
    while (mounted) { // 组件卸载后停止轮询,避免内存泄漏
      yield await getCricketScoreApi();
      await Future.delayed(const Duration(seconds: 1));
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[200],
      body: StreamBuilder<String>(
        stream: streamScore(),
        builder: (context, snapshot) {
          // 先处理加载状态
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const Center(child: CircularProgressIndicator());
          }
          // 处理错误状态
          if (snapshot.hasError) {
            return Center(child: Text("异常:${snapshot.error}"));
          }
          // 处理数据状态
          if (snapshot.hasData) {
            return Center(
              child: Text(
                snapshot.data!,
                style: const TextStyle(color: Colors.grey, fontSize: 25.0),
              ),
            );
          }
          return const Center(child: Text("暂无数据"));
        },
      ),
    );
  }
}
核心修改点说明
  • 替换Stream.periodic为async*生成器写法,每次轮询等待接口请求完成后再发出数据,保证流输出的是实际比分而非Future实例
  • 给所有方法添加明确的泛型和返回类型,请求失败、异常场景都返回非空的提示字符串,解决Stream非空报错
  • 新增mounted判断,组件销毁后自动停止轮询,避免内存泄漏
  • 完善StreamBuilder的状态判断逻辑,覆盖加载、异常、数据、空数据四种场景,避免异常显示

内容的提问来源于stack exchange,提问作者shakky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:54:07