firebase - 如何在数据可用之前等待数据 - 颤动
问题描述
@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 ' 小部件中的数据 ( restaurant1 ) 在可用之前被访问。即使在didChangeDependencies中获取它时放置“ await ”似乎也不起作用。
这是我得到的输出:
颤振:第一个统计
颤动:空
颤振:成功:肯德基
颤振:测试
[VERBOSE-2:profiler_metrics_ios.mm(184)] 检索线程信息时出错:(ipc/send)无效的目标端口
null由 getter 'getRestaurants1' 调用
解决方案
您可以使用小部件并在其参数中FutureBuilder
检索数据。Flutter 官方文档有一个简单的示例,描述了如何声明和使用.future
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,
);
},
);
推荐阅读
- r - R:过渡检测的自动化
- docker - Kubernetes 1.17.2 Rancher 2.3.5 CreateContainerConfigError: stat no such file or directory but the directory is there
- python - python smtplib不发送带有office365地址的电子邮件
- javascript - xModal 窗口只打开一次,比我需要刷新页面
- python - 如何将文本文件中的数据导入熊猫数据框
- android - 如何在 WebView 中禁用复制但启用粘贴?
- javascript - HTML/JS:在元素之间画任意线?
- assembly - MASM 二进制密码匹配检查
- javascript - 使 `npm ls somepackage` 命令尊重版本范围
- r - 转换数据框中的列表折叠一列并在 R 中保持其他列不变