StreamBuilder:必须 return 编辑非空值,因为 return 类型 'Stream' 不允许空值

StreamBuilder: A non-null value must be returned since the return type 'Stream' doesn't allow null

我正在使用 StreamBuilder 小部件实时显示分数(从 API 获取数据,然后将其传递到流中)但是在执行此过程时,它会抛出以下内容错误

“必须 return 编辑非空值,因为 return 类型 'Stream' 不允许空值”

这是代码

class Match extends StatefulWidget {

  @override
  State<Match> createState() => _MatchState();
}

class _MatchState extends State<Match> {
  
    getCricketScoreApi() async {
    var url = Uri.parse(api_url);
    var response = await get(url);
    if(response.statusCode == 200){
      final score = jsonDecode(response.body);
      return  score['cricket_score'];
    } else {
      return print('Something went wrong');
    }
  }

  Stream streamScore() { 
    return Stream.periodic(Duration(seconds: 1), (Timer) => getCricketScoreApi()); // Calling method after every 1 second
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey[200],
      body: StreamBuilder(
          stream: streamScore(),
          builder: (context, snapshot){
              var cricket_score_api = snapshot.data.toString();
              if(snapshot.hasData){
                return Center(
                  child: Text(cricket_score_api, style: TextStyle(color: Colors.grey, fontSize: 25.0)), // Error: Instance of Future
                );
              } else {
                return Text('Null');
              }
          }
      ),
    );
  }
}

所以正如你所说,最初的错误来自于没有 returning 一个值。

当前错误更简单,您正在 return 获取一个值,但该值是 Future 的一个实例,因此当您调用 snapshot.data.toString(); 时,您会得到文字 instance of Future

我想到了两种解决问题的方法,现在是:

1。使您的流函数成为异步*函数:

Stream streamScore() async* {
  while (true) {
    await Future.delayed(Duration(seconds: 1));
    yield await getCricketScoreApi();
  }
}

async* 函数的工作方式类似于 async 函数,但它们不是 return 未来,而是立即 return 一个流并使用yield 关键字。

我不喜欢上述方法的一件事是 while (true) 的用法,它似乎不安全。

2。应对未来

Stream<Future> streamScore() {
  ...
}
...
body: StreamBuilder<Future>(
    stream: streamScore(),
    builder: (context, snapshot){
        if(snapshot.hasData) {
          return FutureBuilder(
            future: snapshot.data!
            builder: (context, snapshot1) {
              if (snapshot.hasData) {
                return Center(child: Text(snapshot1.data!.toString()));
              } 
              return CircularProgressIndicator();
            }
          );
        } else {
          return Text('Null');
        }
    }
),

希望上述解决方案之一能解决新问题?