![](/img/trans.png)
[英]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.