Via*_*lav 6 provider dart flutter riverpod
我已经使用“.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,
);
},
);
Run Code Online (Sandbox Code Playgroud)
然后在 Consumer 中我观看它:
Consumer(
builder: (context, watch, child) {
final state = watch(orderReviewProvider(order.id));
//.....
},
);
Run Code Online (Sandbox Code Playgroud)
但是当我想阅读它时,我order.id也需要通过:
onTap: () {
context
.read(orderReviewProvider(order.id).notifier)
.getOrderItems();
},
Run Code Online (Sandbox Code Playgroud)
当我想从另一个文件向通知程序发送事件时,我没有order.id. 如何摆脱这种困境?谢谢你的帮助!
我想通了。我所需要的只是StateProvider。
final selectedOrderProvider = StateProvider<Order?>((ref) => null);
Run Code Online (Sandbox Code Playgroud)
然后在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,
);
}
}
Run Code Online (Sandbox Code Playgroud)
该文档很好地描述了此操作:链接。
| 归档时间: |
|
| 查看次数: |
3843 次 |
| 最近记录: |