我是 Flutter SDK 的新手,我創建了一個帶有兩個選項卡的 Flutter 應用程式。
在第一個選項卡上,我有一個 ListView,它顯示來自 FutureBuilder 的專案,它通過 http 獲取資料。
在第二個選項卡上,我有一個 ListView,它顯示來自 StreamBuilder 的專案,在將專案從第一個選項卡添加到資料庫后,還通過 http 獲取資料。
問題是:當我來回切換選項卡時,第二個選項卡不會重新加載 http 呼叫并顯示錯誤
錯誤狀態:流已被收聽。
除非我手動按下重繪 按鈕(這是一個 setState(() {}); )然后它會再次加載,有沒有辦法讓它在選項卡更改時重新加載?
這是我的 http 呼叫:
Future<List> getDataDB() async {
final rep = await http.get(Uri.parse("http://192.168.0.105/fluttertest/public/showfood"));
if (rep.statusCode == 200) {
return jsonDecode(rep.body);
} else {
throw Exception('Failed to load');
}
}
Future<List> getDataOrder() async {
String id = widget.list[widget.index]['id'].toString();
final getb = await http.get(Uri.parse("http://192.168.0.105/fluttertest/public/getbill/" id));
if (getb.statusCode == 200) {
return jsonDecode(getb.body);
} else {
throw Exception('Failed to load');
}
}
這是我的 StreamBuilder:
child: StreamBuilder<List>(
stream: Stream.periodic(Duration(seconds: 1))
.asyncMap((i) => getDataOrder()),
builder: (context,snapshot){
List<Widget> children;
if(snapshot.hasData){
children = <Widget>[
Expanded(child: BillItems(list:snapshot.data!,tableid:widget.list[widget.index]['id'])),
];
}
else if (snapshot.hasError) {
children = <Widget>[
Text('Error: ${snapshot.error}'),
];
}
else {
children = const <Widget>[
SizedBox(
child: CircularProgressIndicator(),
),
];
}
return Center(
child: Column(
children: children,
),
);
}
),
'''
uj5u.com熱心網友回復:
問題是:當我來回切換選項卡時,第二個選項卡不會重新加載 http 呼叫并顯示錯誤
錯誤狀態:流已被收聽。
您尚未包含包含選項卡的部分,但Stream只能收聽一次,除非它是廣播流。
該程式產生相同的錯誤:
void main() {
final stream = Stream<int>.fromIterable([1,2,3,4,5]);
stream.forEach(print);
stream.forEach(print);
}
你可以通過這樣呼叫來修復它.asBroadcastStream():
void main() {
final stream = Stream<int>.fromIterable([1,2,3,4,5]).asBroadcastStream();
stream.forEach(print);
stream.forEach(print);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/369067.html
