@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中获取它似乎行不通。
这是我得到的输出:
零>由getter ' getrerestaurants1 '调用flutter: First stat
颤振:零
flutter: SUCCESS:KFC
颤振:测试
[VERBOSE-2:profiler_metrics_ios.mm(184)]检索线程错误输出信息:(ipc/send) invalid destination port
您可以使用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,
);
},
);