如何在数据可用之前等待数据 - flutter

How can I wait for data before it is available - flutter

@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) 在可用之前被访问。即使在 didChangeDependencies 中获取 'await' 似乎也不起作用。

这是我得到的输出:

flutter: First stat

flutter: null

flutter: SUCCESS :KFC

flutter: test

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

null 由 getter 'getRestaurants1'

调用

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

在你的情况下,尝试这样的事情:

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,
    );
  },
);