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
相关产品推荐
相关产品推荐

