【发布时间】:2021-11-19 00:01:42
【问题描述】:
我正在使用riverpod ^1.0.0。我创建了一个扩展 Equatable 的 StateClass。在我的 StateNotifier 中,我根据事件和结果设置状态。一个是异步 http 请求,成功后设置
state=SalesOrderListSuccess(salesOrderListItems: _items);
在 http 客户端失败时,我将状态设置为:
state = SalesOrderListError(error: response.data);
这行得通,成功后它会在下面的 UI 构建器中呈现列表。它还使用 ref.listen 并显示小吃吧。但是,由于状态从 SalesOrderListSuccess 发生变化并且我正在使用 ref.watch,因此它似乎无法保留以前的已知列表和 UI。我如何在最后一个已知的 SalesOrderListSuccess/UI 上方显示小吃栏而不呈现一个全新的错误页面,该页面没有我已经设法在列表中呈现的所有项目?
基本上我不想更改列表,只需在发生 http 客户端错误之前在最后一个已知列表上方显示一个小吃吧。
这里是当前小部件:(这需要 SalesOrderListSuccess 状态才能显示列表)。
@override
Widget build(BuildContext context, WidgetRef ref) {
final todos = ref.watch(todoListProvider);
final selectedtrack = ref.read(selectedProductIdProvider2.notifier);
ref.listen(todoListProvider, (previous, count) {
print(previous);
print(count);
switch (count.runtimeType) {
case SalesOrderListError:
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Ohh no some error happend')),
);
}
});
return ListView.builder(
shrinkWrap: true, // 1st add
physics: ClampingScrollPhysics(),
itemCount: (todos as SalesOrderListSuccess).salesOrderListItems.length,
itemBuilder: (context, index) {
final current=
(todos as SalesOrderListSuccess).salesOrderListItems[index];
return ListTile(
title: Text('${current.title}'),
onTap: () {
selectedtrack.state = index;
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailScreen(),
),
);
});
},
);
}
【问题讨论】: