![](/img/trans.png)
[英]How can I wait for my future function in map function? (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 ' 似乎也不起作用。
這是我得到的 output:
flutter:第一個統計
flutter: null
flutter:成功:肯德基
flutter:測試
[VERBOSE-2:profiler_metrics_ios.mm(184)] 檢索線程信息時出錯:(ipc/send) 目標端口無效
null被 getter 'getRestaurants1' 調用
您可以使用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,
);
},
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.