如何在 flutter 中从 FutureProvider 获取数据
How to get data from the FutureProvider in flutter
我正在尝试在使用 Provider 管理的 flutter 应用程序中实现本地数据库支持,现在我想让数据检索遵循状态管理模式,但我一直未能做到。
我试图制作一个传统的 Provider 来实现此目的,但该应用程序陷入了对数据库的请求循环中,因此经过一番搜索后我找到了 FutureProvider,但我找不到如何获取快照来自正在加载的数据
class _ReceiptsRouteState extends State<ReceiptsRoute> {
List<Receipt> receipts = [];
@override
Widget build(BuildContext context) {
return FutureProvider(
initialData: List(),
builder: (_){
return DBProvider().receipts().then((result) {
receipts = result;
});
},
child: Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context).history),
),
body: Container(
child: ListView.builder(
itemBuilder: (context, position) {
final item = receipts[position];
return ListTile(
title: Text(item.date),
);
},
),
),
),
);
}
}
现在我的应用 运行 如我所愿,但不是它应该如何 运行,我使用 FutureBuilder 直接从数据库中获取数据,但我知道它应该通过提供程序所以我想把它改正
FutureProvider
将 builder
返回的 Future
的结果公开给它的后代。
因此,使用以下 FutureProvider
:
FutureProvider<int>(
initialData: 0,
builder: (_) => Future.value(42),
child: ...
)
可以通过以下方式获取当前值:
Provider.of<int>(context)
或:
Consumer<int>(
builder: (context, value, __) {
return Text(value.toString());
}
);
在我的示例中,我使用 FutureProvider 的创建参数来请求 API,然后我使用 Consumer 来获取 API 的结果。
FutureProvider(
create: (_) => peopleService.getAllSurvivor(),
child: Consumer<List<Survivor>>(builder: (context, survivors, _) {
return survivors == null
? Center(child: CircularProgressIndicator())
: ListView.builder(
itemCount: survivors.length,
itemBuilder: (context, index) {
var survivor = survivors[index];
return ListTile(
title: Text(survivor.name),
subtitle: Text(survivor.gender),
leading: Icon(Icons.perm_identity),
);
},
);
})));
我正在尝试在使用 Provider 管理的 flutter 应用程序中实现本地数据库支持,现在我想让数据检索遵循状态管理模式,但我一直未能做到。
我试图制作一个传统的 Provider 来实现此目的,但该应用程序陷入了对数据库的请求循环中,因此经过一番搜索后我找到了 FutureProvider,但我找不到如何获取快照来自正在加载的数据
class _ReceiptsRouteState extends State<ReceiptsRoute> {
List<Receipt> receipts = [];
@override
Widget build(BuildContext context) {
return FutureProvider(
initialData: List(),
builder: (_){
return DBProvider().receipts().then((result) {
receipts = result;
});
},
child: Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context).history),
),
body: Container(
child: ListView.builder(
itemBuilder: (context, position) {
final item = receipts[position];
return ListTile(
title: Text(item.date),
);
},
),
),
),
);
}
}
现在我的应用 运行 如我所愿,但不是它应该如何 运行,我使用 FutureBuilder 直接从数据库中获取数据,但我知道它应该通过提供程序所以我想把它改正
FutureProvider
将 builder
返回的 Future
的结果公开给它的后代。
因此,使用以下 FutureProvider
:
FutureProvider<int>(
initialData: 0,
builder: (_) => Future.value(42),
child: ...
)
可以通过以下方式获取当前值:
Provider.of<int>(context)
或:
Consumer<int>(
builder: (context, value, __) {
return Text(value.toString());
}
);
在我的示例中,我使用 FutureProvider 的创建参数来请求 API,然后我使用 Consumer 来获取 API 的结果。
FutureProvider(
create: (_) => peopleService.getAllSurvivor(),
child: Consumer<List<Survivor>>(builder: (context, survivors, _) {
return survivors == null
? Center(child: CircularProgressIndicator())
: ListView.builder(
itemCount: survivors.length,
itemBuilder: (context, index) {
var survivor = survivors[index];
return ListTile(
title: Text(survivor.name),
subtitle: Text(survivor.gender),
leading: Icon(Icons.perm_identity),
);
},
);
})));