繁体   English   中英

如何在颤振中更改 FutureBuilder connection.state

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM