首页 > 解决方案 > 为什么这个异步数据不在 initState 上加载?

问题描述

在查看了包括这个 SO post在内的资源之后,我仍然不确定为什么我的数据没有加载到 initState 上:

class _MyAppState extends State<MyApp> {
  List<NewsItem> itemList = [];

  void _getNews() async {
    final news = await http.get(Uri.parse(
        'https://newsapi.org/...'));
    if (news.statusCode == 200) {
      itemList.clear();
      var articles = jsonDecode(news.body)['articles'];

      for (int i = 0; i < articles.length; i++) {
        var newsItem = articles[i];
        var item = NewsItem.fromJson(newsItem);
        itemList.add(item);
      }
    } else {
      throw Exception('Failed to retrieve news.');
    }
  }

  Future<void> _getData() async {
    setState(() {
      _getNews();
    });
  }

  @override
  void initState() {
    super.initState();
    _getNews();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'NewsAPI.org Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(title: const Text("News App")),
        body: RefreshIndicator(
          onRefresh: _getData,
          child: ListView.builder(
            itemCount: itemList.length,
            itemBuilder: (context, i) {
              return GestureDetector(
                onTap: () {
                  if (itemList[i].url != null) {
                    var _url = itemList[i].url!;
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => DisplayWebPage(_url)),
                    );
                  }
                },
                child: Card(
                  elevation: 10,
                  shadowColor: Colors.black,
                  child: Padding(
                    padding: const EdgeInsets.all(10),
                    child: Column(
                      children: [
                        Image.network(itemList[i].urlToImage ?? ''),
                        Text(itemList[i].title ?? '',
                            style: const TextStyle(
                                fontWeight: FontWeight.bold, fontSize: 14)),
                        Text(itemList[i].description ?? ''),
                        const Divider(
                          color: Colors.black,
                          height: 25,
                          thickness: 2,
                        ),
                      ],
                    ),
                  ),
                ),
              );
            },
          ),
        ),
      ),
    );
  }
}

当应用程序加载时,屏幕是空白的。如果我拉刷新,即调用_getData(),然后加载预期的网络数据。我认为setState()在初始化期间调用并不重要,但我也尝试_getNews()在启动时调用。(没关系。)

代码应该是什么,以便在应用程序启动时加载 Web 数据?

标签: flutterdartasync-awaitinitialization

解决方案


推荐阅读