Flutter:如何在加载页面之前从 Api 获取数据 [关闭]

Posted

技术标签:

【中文标题】Flutter:如何在加载页面之前从 Api 获取数据 [关闭]【英文标题】:Flutter:How to get data from Api before loading page [closed] 【发布时间】:2021-01-24 11:41:41 【问题描述】:

我试图从 Api 获取数据以显示在屏幕上,因此我创建了一个函数并从小部件构建函数中调用它,或者我也尝试从构造函数中调用它,但它最终会调用该函数,因此列出空错误来了。

我想在屏幕加载之前调用 api 并将数据存储在 List 中。

【问题讨论】:

请提供您的代码到目前为止您尝试了什么。 【参考方案1】:

你可以通过下面的代码来实现:

首先,您必须在类似 Button 的按钮中使用 onPressedonTap 方法点击 Api

onPressed: () 
  getNutritionDetails(context,"2");
  getDataFromMyApi(context);
,

然后创建一个函数,让代码更干净,更易阅读,这里我将函数命名为getDataFromMyApi

void getDataFromMyApi(BuildContext context) 
    //Getting data from API and store it in String or Model or List whatever you required.
    String myData;

    //and then pass the data to your second activity
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) =>
            MyStatefulWidget(myData), // Your Api response myData is Passing to Stateful Widget
      ),
    );
  

然后我制作了一个有状态的小部件,您希望在其中传递数据并希望它在打开之前加载数据,并且您可以在页面加载之前将数据放入myData var。

class MyStatefulWidget extends StatefulWidget 
  String myData;

  MyStatefulWidget(this.myData, Key key) : super(key: key);

  @override
  _MyStatefulWidgetState createState() => _MyStatefulWidgetState();


class _MyStatefulWidgetState extends State<MyStatefulWidget> 
  @override
  Widget build(BuildContext context) 
    return Container(
      height: double.infinity,
        width: double.infinity,
      child: Text(widget.myData),
    );
  

您可以使用 Future Builder

问题:Future Builder 是做什么的?

回答:它调用future函数来等待结果,一旦它产生结果,它就会调用我们构建widget的builder函数。

class _ExampleState extends State<Example> 

@override
Widget build(BuildContext context) 
  return FutureBuilder<String>(
    future: downloadData(), // function where you call your api
    builder: (BuildContext context, AsyncSnapshot<String> snapshot)   // AsyncSnapshot<Your object type>
      if( snapshot.connectionState == ConnectionState.waiting)
          return  Center(child: Text('Please wait its loading...'));
      else
          if (snapshot.hasError)
            return Center(child: Text('Error: $snapshot.error'));
          else
            return Center(child: new Text('$snapshot.data'));  // snapshot.data  :- get your object which is pass from your downloadData() function
      
    ,
  );

Future<String> downloadData()async
  //   var response =  await http.get('https://getProjectList');    
  return Future.value("Data download successfully"); // return your response


【讨论】:

谢谢,很好的解释..像魅力一样工作.. 真的很高兴能提供帮助。 @MohammadArman @Maz341 如果在颤振中显示带有 api 数据获取的加载器 是的,您可以使用相同的方法。当点击 api 时将 isLoading 的值设置为 true (isLoading = true),然后在收到响应后设置 isLoading = false;

以上是关于Flutter:如何在加载页面之前从 Api 获取数据 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何让页面等到数据加载?

如何防止在用户输入反应之前从 API 加载数据?

获取 API 时页面重新加载

从VueJS中的api获取数据时如何添加加载器? [复制]

如何在 Flutter 中显示从 .NET Core API 加载的 jpeg 图像?

如何在 Flutter 中设置定时器来定期更新 API 数据