我是新来的,最近我决定研究提供者,以便能够重用我使用FutureBuilder 的一些 sqlite DB 调用,正如其他问题中所建议的那样。
在阅读了它之后,我开始使用riverpod_hooks,但我被卡住了。
目前我有一个提供程序来从 sqlite 获取数据:
final bloodPressureProvider = FutureProvider((_) => _findAllBloodPressures());
Future<List<BloodPressure>> _findAllBloodPressures() async {
var _bloodPressure = BloodPressure.forSearchOnly();
var result = await _bloodPressure.findAll();
return result;
}
我可以成功地使用它来呈现图表并显示列表:
class BloodPressureList extends HookWidget {
@override
Widget build(BuildContext context) {
final bpList = useProvider(bloodPressureProvider);
return Scaffold(
drawer: NutriDrawer(context).drawer(),
appBar: AppBar(
title: Text('Blood Pressure History'),
),
body: Column(
children: [
Container(
padding: EdgeInsets.fromLTRB(0, 25, 15, 5),
child: bpList.when(
data: (bloodPressureList) => _buildLineChart(bloodPressureList),
loading: () => CircularProgressIndicator(),
error: (_, __) => Text('Ooooopsss error'),
),
),
Expanded(
child: bpList.when(
data: (bloodPressureList) => _getSlidableListView(bloodPressureList, context),
loading: () => CircularProgressIndicator(),
error: (_, __) => Text('Ooopsss error'),
),
),
],
), ...
我目前遇到的问题是每当将新元素添加到数据库中时向小部件发出通知,这是在另一个屏幕/小部件中完成的,在使用提供程序之前我会使用 setState 但现在我知道我应该实现可能的 StateNotifier 但我我错过了与从上面提供程序片段中使用的数据库返回的异步调用集成的正确方法。
非常感谢任何正确方向的指针。
更新解决方案:根据下面接受的答案,我使用了 context.refresh ,它完全符合我的要求:
var result = Navigator.push(context, MaterialPageRoute(builder: (context) {
return BloodPressureDetail(title, bloodPressure);
}));
result.then((_) => context.refresh(bloodPressureProvider));
因此,当从编辑/添加屏幕返回时,提供程序上下文会刷新,并且图表和列表的状态会自动更新。