[英]How to use refresh indicator inside a futurebuilder in flutter
[英]How to change FutureBuilder connection.state in flutter
在這里,我正在點擊 api 來獲取數據,但是我正在獲取數據,因為我已經打印了數據。 但是當我使用 FutureBuilder connection.state 時,它沒有返回並返回視圖。 我想知道如何將 connection.state 的狀態更改為 Done,以便我可以顯示我的視圖。
*class DashboardScreen extends StatefulWidget {
@override
_DashboardScreen createState() => _DashboardScreen();
}
class _DashboardScreen extends State<DashboardScreen> {
Future<DashboardModel> futureDashboard;
// api hit
@override
void didChangeDependencies() {
super.didChangeDependencies();
Future.delayed(Duration.zero, () {
WidgetsBinding.instance.addPostFrameCallback((_) async{
futureDashboard = dashboardData();
}
);
});
}
// 這里是儀表盤數據
Future<dynamic> dashboardData() async {
pr.show();
final String url =
'${GlobalConfiguration().getString('api_base_url')}${GlobalConfiguration().getString('dashboard')}';
final response = await http.post(
url,
body: {
"auth_key": '${GlobalConfiguration().getString('auth_key')}',
},
);
responseJson = json.decode(response.body);
Map<String, dynamic> map = jsonDecode(response.body);
DashboardModel dashboardModel = DashboardModel.fromJson(map);
_dashboard = DashboardModel.fromJson(responseJson);
if (_dashboard.statusCode == "200") {
final String responseString = response.body;
pr.hide();
showSimpleFlushbar(context, 'Successful');
return dashboardModelFromJson(responseString);
} else {
pr.hide();
return null;
}
}
// setting the data in the view created
@override
Widget build(BuildContext context) {
// scaffold view
return new Scaffold(
body: Container(
height: double.infinity,
width: double.infinity,
padding: EdgeInsets.symmetric(vertical: 10),
child: FutureBuilder<DashboardModel>(
future: futureDashboard,
builder: (context, AsyncSnapshot<DashboardModel> futureDashboard) {
switch (futureDashboard.connectionState) {
case ConnectionState.none:
return Container(
child: Center(
child: Text(
'No Connection Message')
)
);
case ConnectionState.active:
return Text('Active result...');
case ConnectionState.waiting:
return Text('Awaiting result...');
case ConnectionState.done:
print(futureDashboard);
if (futureDashboard.hasData) {
ListTile(
title: Text("data"),);
} else if (futureDashboard.hasError) {
return showSimpleFlushbar(context, "${futureDashboard.error}");
}
return Container(
child: Text('error'),
);
}
return Container(
child: Text('errornot'),
);
}),
),
);
}*
當 Future 中有未捕獲的異常時,可能會發生這種情況。 你調試過你的代碼嗎? 嘗試在response
分配后立即設置調試斷點,看看您是否確實收到了響應。 這將幫助您了解您的代碼是否有效。
附注。 旁注:不要pr.show() / hide();
或showSimpleFlushbar(context, 'Successful');
在函數中。 這些屬於 FutureBuilder 的builder
部分,因為它們必須處理重新繪制小部件樹。 最好的情況是這些代碼行不起作用,最壞的情況是它們會給您帶來奇怪的錯誤。
您可以嘗試添加代碼嗎
Future.delayed(Duration.zero, () {
WidgetsBinding.instance.addPostFrameCallback((_) async{
futureDashboard = dashboardData();
}
);
});
到initState
沒有Future.delayed
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.