我如何在数据可用之前等待数据-颤振


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

数据(restaurants1)内的RestaurantList'小部件在可用之前就被访问了。即使输入'await'同时在didChangeDependencies中获取它似乎行不通。

这是我得到的输出:

flutter: First stat

颤振:零

flutter: SUCCESS:KFC

颤振:测试

[VERBOSE-2:profiler_metrics_ios.mm(184)]检索线程错误输出信息:(ipc/send) invalid destination port

>由getter ' getrerestaurants1 '调用

您可以使用FutureBuilder小部件并检索其future参数中的数据。官方Flutter文档有一个简单的例子,描述了如何声明和使用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,
);
},
);

最新更新