【问题标题】:How to change FutureBuilder connection.state in flutter如何在颤动中更改 FutureBuilder 的 connection.state
【发布时间】:2020-12-12 19:27:17
【问题描述】:

在这里,我正在使用 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'),
              );
          }),
  ),
);
}*

【问题讨论】:

  • 你会发布你的dashboardData()代码吗?
  • 我猜日志上没有错误!对吗?
  • 您不需要更改未来的构建器状态。简单地使用FutureBuilder() 并检查status == done 然后显示。你可以在这里找到更多信息api.flutter.dev/flutter/widgets/FutureBuilder-class.html
  • @LapaNyAinaTanjona 不,我不是
  • @OMiShah 让我试试谢谢

标签: android ios flutter flutter-layout


【解决方案1】:

当 Future 中存在未捕获的异常时,可能会发生这种情况。你调试过你的代码吗?尝试在response 分配后放置一个调试断点,看看你是否真的得到了响应。这将帮助您了解您的代码是否有效。

PS。旁注:不要在函数中使用pr.show() / hide();showSimpleFlushbar(context, 'Successful');。这些属于 FutureBuilder 的builder 部分,因为它们必须处理重绘小部件树。最好的情况是这些代码行不起作用,最坏的情况是它们会给您带来奇怪的错误。

【讨论】:

  • I/FA (8558): 未找到跟踪代码管理器,因此不会使用 I/flutter (8558): null I/flutter (8558): ConnectionState.none I/flutter (8558) : false I/flutter (8558): 200 I/flutter (8558): Success I/flutter (8558): 3 I/flutter (8558): 通过了这就是我在控制台中得到的结果
  • 如果对主题不熟悉youtube.com/watch?v=RcY4lX3SeEo
  • 先生,我已经调试了应用程序,我没有收到任何错误,我可以看到来自 api 的成功消息。但是首先 ConnectionState.none 被执行,之后我可以看到我的 api 的响应,尽管在那之后 ConnectionState 不会重定向到活动或任何其他状态。
【解决方案2】:

你可以尝试添加代码

Future.delayed(Duration.zero, () {
          WidgetsBinding.instance.addPostFrameCallback((_) async{
            
            futureDashboard = dashboardData();
          }
          );
        });

initState 没有Future.delayed

【讨论】:

  • 好吧,直接使用dashboardData()FutureBuilder
猜你喜欢
  • 2020-12-10
  • 2021-01-18
  • 1970-01-01
  • 2021-07-16
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
相关资源
最近更新 更多