我使用此扩展来获取实例的所有StateNotifierProviderFamily
实例,但您也可以为ChangeNotifierProviderFamily
. 您确实需要在提供程序中注册它们:
extension StateNotifierProviderFamilyExtension<
Notifier extends StateNotifier<Value>,
Value,
Param> on StateNotifierProviderFamily<Notifier, Value, Param> {
/// Get all the registered versions of this `StateNotifierProviderFamily`
///
/// This function requires a reader to the current `ProviderScope` to
/// get the `familyKeysStorageProvider`
///
/// The family needs to be registered with the `familyKeysStorageProvider`,
/// like this:
///
/// ```dart
/// final keyStorage = ref.read(familyKeysStorageProvider(myProvider));
/// keyStorage.state.add(myKey);
/// ```
Iterable<T> all<T extends StateNotifierProvider<Notifier, Value>>(
Reader read) {
return read(_familyKeysStorageProvider(this))
.state
.map((key) => call(key) as T);
}
Set<dynamic> keys(Reader read) =>
read(_familyKeysStorageProvider(this)).state;
void addKey(Reader read, dynamic key) => this.keys(read).add(key);
}
/// Use this provider to register keys for a `StateNotifierProviderFamily`
/// object.
///
/// After registration of the keys, it is possible to retrieve all registered
/// instances with the `all(Reader read)` method on `StateNotifierProviderFamily`
final _familyKeysStorageProvider =
StateProvider.family<Set<dynamic>, StateNotifierProviderFamily>((ref, key) {
return {};
});
你可以这样注册:
final myStateProvider = StateNotifierProvider.family<
MyStateNotifier,
MyState,
MyKey>(
(ref, key) {
myStateProvider.addKey(ref.read, key);
return MyStateNotifier(ref.read, key);
},
);
当然,您还需要导入扩展才能使其正常工作。
对于ChangeNotifierProviderFamily
我认为它会是这样的(我没有测试过):
extension ChangeNotifierProviderFamilyExtension<Notifier extends ChangeNotifier,
Param> on ChangeNotifierProviderFamily<Notifier, Param> {
Iterable<T> all<T extends ChangeNotifierProvider<Notifier>>(Reader read) {
return read(_notifierFamilyKeysStorageProvider(this))
.state
.map((key) => call(key) as T);
}
Set<dynamic> keys(Reader read) =>
read(_notifierFamilyKeysStorageProvider(this)).state;
void addKey(Reader read, dynamic key) => this.keys(read).add(key);
}
final _notifierFamilyKeysStorageProvider =
StateProvider.family<Set<dynamic>, ChangeNotifierProviderFamily>(
(ref, key) {
return {};
});