如何等待数据可用-扑朔迷离 [英] How can I wait for data before it is available - flutter

查看:173
本文介绍了如何等待数据可用-扑朔迷离的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

@override
  void didChangeDependencies() async {
    if (_isInit) {
      print('First stat');
      final restaurant = await Provider.of<Restaurants>(context, listen: false)
          .fetchAndSetRestaurants();
      print('test');
    }
    _isInit = false;

    super.didChangeDependencies();
  }

  bool showFavourites = false;

  @override
  Widget build(BuildContext context) {
   
    return Scaffold(
        //bottomNavigationBar: BottomNavBar(),
        appBar: homeAppBar(context),
        body: SingleChildScrollView(
          child: showFavourites
              ? Padding(
                  padding: const EdgeInsets.only(top: 20),
                  child:
                      RestaurantList(), //RestaurantList(restaurants: restaurants)
                )
              : Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                      SearchBox(
                        onChanged: (value) {},
                      ),
                      CategoryList(),
                      RestaurantList(), //RestaurantList(restaurants: restaurants)
                    ]),
        ));
  }
}

class RestaurantList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final List<Restaurant> restaurants1 =
        Provider.of<Restaurants>(context).getRestaurants1;
    print('List: ${restaurants1[0].name}');
    
    return ListView.builder(
      scrollDirection: Axis.vertical,
      shrinkWrap: true,
      itemBuilder: (ctx, i) =>
          restaurants1[i].isAvailable || restaurants1[i].totalQuantity != 0
              ? Column(
                  children: [
                    ChangeNotifierProvider.value(
                        value: restaurants1[i], child: RestaurantCard()),
                    Divider(),
                  ],
                )
              : Container(),
      itemCount: restaurants1.length,
    );
  }

正在访问" RestaurantList "小部件中的数据( restaurants1 ).甚至在将 await 放入 didChangeDependencies 时,似乎也不起作用.

The data (restaurants1) inside the 'RestaurantList' widget is being accessed before it is available. Even putting 'await' while fetching it in didChangeDependencies doesn't seem to work.

这是我得到的输出:

颤振:首次统计

颤动:空

颤振:成功:肯德基

颤动:测试

[VERBOSE-2:profiler_metrics_ios.mm(184)]检索线程时出错信息:(ipc/发送)无效的目标端口

[VERBOSE-2:profiler_metrics_ios.mm(184)] Error retrieving thread information: (ipc/send) invalid destination port

被getter"getRestaurants1"调用

null is called by the getter 'getRestaurants1'

推荐答案

您可以使用 FutureBuilder 小部件并在其 future 参数中检索数据.官方Flutter文档有一个简单的示例,描述了如何声明和使用 FutureBuilder .

You can use FutureBuilder widget and retrieve data inside it's future parameter. Official Flutter Documentation has simple example that describe how to declare and work with FutureBuilder.

在您的情况下,请尝试以下操作:

In your case, try something like this:

FutureBuilder<List<Restaurant>>(
  future: Provider.of<Restaurants>(context, listen: false).fetchAndSetRestaurants(),
  builder: (context, snapshot) {
    // Items are not available and you need to handle this situation, simple solution is to show a progress indicator
    if (!snapshot.hasData) {
      return CircularProgressIndicator();
    }
    return ListView.builder(
      scrollDirection: Axis.vertical,
      shrinkWrap: true,
      itemBuilder: (ctx, i) =>
          restaurants1[i].isAvailable || restaurants1[i].totalQuantity != 0
              ? Column(
                  children: [
                    ChangeNotifierProvider.value(
                        value: restaurants1[i], child: RestaurantCard()),
                    Divider(),
                  ],
                )
              : Container(),
      itemCount: restaurants1.length,
    );
  },
);

这篇关于如何等待数据可用-扑朔迷离的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆