简体   繁体   English

如何在不传递值的情况下读取 StateNotifierProvider.family?

[英]How to read StateNotifierProvider.family without passing value?

I have implemented StateNotifierProvider with ".family" modifier:我已经使用“.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,
    );
  },
);

Then in Consumer I watch it:然后在消费者中我观看它:

        Consumer(
            builder: (context, watch, child) {
              
              final state = watch(orderReviewProvider(order.id));

             //.....
            },
          );

But when I want to read it, I need to pass order.id too:但是当我想阅读它时,我也需要传递order.id

                  onTap: () {
                    context
                        .read(orderReviewProvider(order.id).notifier)
                        .getOrderItems();
                  },

When I want to send events to notifier from another file, I don't have order.id .当我想从另一个文件向通知器发送事件时,我没有order.id How to get out of this situation?如何摆脱这种局面? Thanks for any help!谢谢你的帮助!

I figured out.我想通了。 All I needed was StateProvider .我只需要StateProvider

final selectedOrderProvider = StateProvider<Order?>((ref) => null);

Then in orderReviewProvider I can easily get orderId.然后在 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,
    );
  }
}

The documentation describes the work with this well: link .文档很好地描述了这个工作: 链接

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM