如何解决如何在不传递值的情况下读取 StateNotifierProvider.family?
我已经使用“.family”修饰符实现了 StateNotifierProvider:
class OrderReviewNotifier extends StateNotifier<OrderReviewState> {
final OrderReviewRepository repository;
OrderReviewNotifier(
this.repository,int orderId,) : super(OrderReviewState.initial(orderId));
Future<void> getorderItems() async {
//.....
}
}
final orderReviewProvider = StateNotifierProvider.autodispose
.family<OrderReviewNotifier,OrderReviewState,int>(
(ref,orderId) {
return OrderReviewNotifier(
ref.watch(orderReviewRepositoryProvider),orderId,);
},);
然后在消费者我看它:
Consumer(
builder: (context,watch,child) {
final state = watch(orderReviewProvider(order.id));
//.....
},);
但是当我想阅读它时,我也需要通过order.id
:
onTap: () {
context
.read(orderReviewProvider(order.id).notifier)
.getorderItems();
},
当我想从另一个文件向通知程序发送事件时,我没有 order.id
。
如何摆脱这种局面?
感谢您的帮助!
解决方法
我想通了。
我只需要StateProvider
。
final selectedOrderProvider = StateProvider<Order?>((ref) => null);
然后在 orderReviewProvider 中我可以轻松获取 orderId。
final orderReviewProvider =
StateNotifierProvider.autoDispose<OrderReviewNotifier,OrderReviewState>(
(ref) {
return OrderReviewNotifier(
ref.read,orderId: ref.watch(selectedOrderProvider).state!.id,repository: ref.watch(orderReviewRepositoryProvider),);
},);
class OrderReviewNotifier extends StateNotifier<OrderReviewState> {
OrderReviewNotifier(
this.read,{
required int orderId,required this.repository,}) : super(OrderReviewState.initial(orderId)) {
getOrderItems();
}
final Reader read;
final OrderReviewRepository repository;
Future<void> getOrderItems() async {
state = state.copyWith(
isLoading: true,error: null,);
final result = await repository.getOrderItems(state.orderId);
final checkedItemIds = await repository.getCheckedItemIds(state.orderId);
if (!mounted) {
return;
}
result.when(
data: (data) {
final isAllItemsChecked = !checkedItemIds.containsValue(false) &&
checkedItemIds.length >= data.length;
state = state.copyWith(
orderItems: data,checkedItemIds: checkedItemIds,isAllItemsChecked: isAllItemsChecked,);
},error: (message) {
state = state.copyWith(
error: message,);
state = state.copyWith(
isLoading: false,);
}
}
文档描述了这口井的工作:link。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。