dart StreamProvider是否处理以前的Stream示例及其订阅?

6za6bjd0  于 2023-03-27  发布在  其他
关注(0)|答案(1)|浏览(120)

请查看以下使用Dart Riverpod的伪代码。

final dependingStreamProvider = StreamProvider.autoDispose<int>((ref) {
  final depending = ref.watch(dependingProvider);

  if (depending == typeA) {
     return AStream(); // returns stream of int
  } else {
     return BStream(); // returns a different stream of int
  }
});

在本例中,当dependingProvider更改其状态时,StreamProvider将创建另一个Stream示例。
我的问题是,过时的Stream示例是否会被Riverpod处理掉(即它的StreamController得到close d)?或者我们必须以某种方式处理自己?
我在这里看到了类似的问题:Do you have to manually dispose streams from a streamprovider in Flutter?,但我不太确定是否接受的答案是指我的情况以上。
我知道当没有人监听StreamProvider本身时,autoDispose会负责处理,但上述情况是另一种情况。🤔

rxztt3cl

rxztt3cl1#

我继续创建了一个示例代码。
TL;DR是的,StreamProvider会处理以前的Stream示例及其订阅。
我创建了以下Provider s,以便streamProvider根据switcherProvider的状态在streamAstreamB之间切换。

final streamProvider = StreamProvider<int>((ref) {
  final switcher = ref.watch(switcherProvider);

  if (switcher == StreamType.A) {
    return streamA;
  } else {
    return streamB;
  }
});

final streamA = Stream.periodic(const Duration(seconds: 1), (x) {
  print("Emitting $x from stream A");
  return x;
});

final streamB = Stream.periodic(const Duration(seconds: 1), (x) {
  print("Emitting $x from stream B");
  return x;
});

enum StreamType { A, B }

class StreamTypeNotifier extends StateNotifier<StreamType> {
  StreamTypeNotifier() : super(StreamType.A);

  void switchStream() {
    state = state == StreamType.A ? StreamType.B : StreamType.A;
  }
}

final switcherProvider =
    StateNotifierProvider<StreamTypeNotifier, StreamType>((ref) {
  return StreamTypeNotifier();
});

点击FAB时,切换switcherProvider的状态。

void _toggleSwitcher() {
    ref.read(switcherProvider.notifier).switchStream();
    ...
 }

...

  @override
  Widget build(BuildContext context) {
    ref.watch(streamProvider);
    ...
  }

结果是这样的:

当我第一次点击FAB并切换到streamB时,streamA没有发出新值。当我第二次点击FAB并切换到streamA时,没有流发出任何值,因为两个流都自动关闭了。

相关问题