我正在使用 StreamBuilder 小部件實時顯示分數(從 API 獲取資料,然后將其傳遞給流)但是在執行此程序時,它拋出以下錯誤
“必須回傳非空值,因為回傳型別 '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');
}
}
),
);
}
}
uj5u.com熱心網友回復:
正如您所說,原始錯誤來自未回傳值。
當前的錯誤更簡單,您正在回傳一個值,但該值是 的一個實體Future,因此當您呼叫 時snapshot.data.toString();,您將獲得文字文本instance of Future
我想出了兩種解決問題的方法,現在是:
1. 使您的流函式成為 async* 函式:
Stream streamScore() async* {
while (true) {
await Future.delayed(Duration(seconds: 1));
yield await getCricketScoreApi();
}
}
async*函式像async函式一樣作業,但不是回傳未來,而是立即回傳一個流并使用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');
}
}
),
希望上述解決方案之一解決了新問題?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/367000.html
上一篇:將函式作為引數傳遞給小部件
下一篇:身份驗證狀態更改回傳始終為空
