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');
}
}
),
希望上述解决方案之一能解决新问题?
我正在使用 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');
}
}
),
希望上述解决方案之一能解决新问题?