简体   繁体   English

Riverpod 监视多个相同类型的提供者并返回最新值

[英]Riverpod watch multiple providers of the same type and return latest value

I have a question regarding riverpod library and its possibilities.我有一个关于 Riverpod 库及其可能性的问题。

What I want to achieve is to have one provider that emits latest value from three different providers.我想要实现的是让一个提供者从三个不同的提供者那里发出最新的价值。 I can easily do this with StreamGroup.merge([stream1, stream2, sream3]) but I am thinking if there is other way just by using multiple ref.watch() and return last emitted value.我可以使用StreamGroup.merge([stream1, stream2, sream3])轻松地做到这一点,但我在想是否有其他方法只需使用多个ref.watch()并返回最后一个发出的值。

I saw that in Provider there is a solution with ConsumerN where I can pass multiple providers, but I don't see anything similar in Riverpod.我在 Provider 中看到有一个带有ConsumerN的解决方案,我可以在其中传递多个提供程序,但在 Riverpod 中我看不到任何类似的东西。

What I have now and it works fine:我现在拥有的,它工作正常:

final filteredList1 = StreamProvider<FilteredList>((ref) async* {
  final value1 = ref
      .watch(valueProvider1)
      .value;
  final value2 = ref
      .watch(valueProvider2)
      .value;
  yield ref
      .read(repository)
      .filterList(value1, value2);
});

final filteredList1 = StreamProvider<FilteredList>((ref) async* {
  final value3 = ref
      .watch(valueProvider3)
      .value;
  final value4 = ref
      .watch(valueProvider4)
      .value;
  yield ref
      .read(repository)
      .filterList(value3, value4);
});

final filteredList3 = StreamProvider<FilteredList>((ref) async* {
  final value5 = ref
      .watch(valueProvider5)
      .value;
  final value6 = ref
      .watch(valueProvider6)
      .value;
  yield ref
      .read(repository)
      .filterList(value5, value6);
});

final lastFilteredListProvider =
    StreamProvider<FilteredList>((ref) => StreamGroup.merge([
          ref.watch(filteredList1.stream),
          ref.watch(filteredList2.stream),
          ref.watch(filteredList3.stream)
        ]));

And what I would like to achieve, is to not use Stream for that but maybe something like this:我想要实现的是不使用 Stream ,但可能是这样的:

final filteredList1 = Provider<FilteredList>((ref) {
  final value1 = ref
      .watch(valueProvider1)
      .value;
  final value2 = ref
      .watch(valueProvider2)
      .value;
  return ref
      .read(repository)
      .filterList(value1, value2);
});

final filteredList1 = Provider<FilteredList>((ref) {
  final value3 = ref
      .watch(valueProvider3)
      .value;
  final value4 = ref
      .watch(valueProvider4)
      .value;
  return ref
      .read(repository)
      .filterList(value3, value4);
});

final filteredList3 = Provider<FilteredList>((ref) {
  final value5 = ref
      .watch(valueProvider5)
      .value;
  final value6 = ref
      .watch(valueProvider6)
      .value;
  return ref
      .read(repository)
      .filterList(value5, value6);
});

final lastFilteredListProvider =
    Provider<FilteredList>((ref) {
      final filteredList1 = ref.watch(filteredList1);
      final filteredList2 = ref.watch(filteredList2);
      final filteredList3 = ref.watch(filteredList3);
     // EMIT HERE LATEST LIST
});

I think you are most of the way there already.我想你已经大部分时间了。

You can combine providers like you have already and in the case of lists you can emit a new instance of a list when one or more providers being watched update their values.您可以像以前一样组合提供者,对于列表,您可以在一个或多个被监视的提供者更新其值时发出列表的新实例。

I noticed you are calling both watch and read in some of your code.我注意到您在某些代码中同时调用了watchread It isn't advised to call read when combining providers [ref] .不建议在组合提供者[ref]时调用read The difference between the 2 methods is you will not be notified of changes when reading and will only get a single value.这两种方法之间的区别在于,您在阅读时不会收到更改通知,只会得到一个值。

I was unsure what FilteredCompanies is but if its just a an alias for a type of List<T> then the following would work.我不确定FilteredCompanies是什么,但如果它只是List<T>类型的别名,那么以下将起作用。

final lastFilteredListProvider =
    Provider<FilteredCompanies>((ref) {
      final filteredList1 = ref.watch(filteredList1);
      final filteredList2 = ref.watch(filteredList2);
      final filteredList3 = ref.watch(filteredList3);
      return [...filteredList1, ...filteredList2, ...filteredList3];
});

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

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