【发布时间】:2021-03-06 11:07:04
【问题描述】:
我是 Flutter 的新手,最近我决定研究提供程序,以便能够重用我使用 FutureBuilder as suggested in this other question 进行的一些 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));
因此,当从编辑/添加屏幕返回时,提供程序上下文会刷新,并且图表和列表的状态会自动更新。
【问题讨论】:
标签: flutter riverpod flutter-hooks