簡體   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