-
-
Notifications
You must be signed in to change notification settings - Fork 908
/
family.dart
323 lines (278 loc) · 8.88 KB
/
family.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
part of '../framework.dart';
/// A [Create] equivalent used by [Family].
@internal
typedef FamilyCreate<T, R extends Ref, Arg> = T Function(
R ref,
Arg arg,
);
/// A base class for all families
abstract class Family<State> extends ProviderOrFamily
implements FamilyOverride<State> {
/// A base class for all families
const Family();
@override
List<ProviderOrFamily>? get dependencies;
/// The family name.
@protected
String? get name;
@override
Family<Object?>? get from => null;
@override
Family<State> get overriddenFamily => this;
}
mixin _FamilyMixin<State, Arg, FamilyProvider extends ProviderBase<State>>
on Family<State> {
/// Create a provider from an external value.
///
/// That external value should be immutable and preferably override `==`/`hashCode`.
/// See the documentation of [Provider.family] for more information.
FamilyProvider call(Arg argument);
/// Overrides the behavior of a family for a part of the application.
///
/// {@macro riverpod.overrideWith}
Override overrideWithProvider(
FamilyProvider Function(Arg argument) override,
) {
return FamilyOverrideImpl<State, Arg, FamilyProvider>(this, override);
}
@visibleForOverriding
@override
ProviderBase<State> getProviderOverride(ProviderBase<State> provider) {
return call(provider.argument as Arg);
}
}
/// Setup how a family is overridden
@internal
typedef SetupFamilyOverride<Arg> = void Function(
Arg argument,
void Function({
required ProviderBase origin,
required ProviderBase override,
}),
);
/// Do not use: Internal object to used by [ProviderContainer]/`ProviderScope`
/// to override the behavior of a "family" for part of the application.
@internal
abstract class FamilyOverride<State> implements Override {
/// The family that was overridden.
Family<State> get overriddenFamily;
/// Obtains the new behavior for a provider associated to the overridden family.
@visibleForOverriding
ProviderBase<State> getProviderOverride(ProviderBase<State> provider);
}
/// An [Override] for families
@internal
class FamilyOverrideImpl<State, Arg, FamilyProvider extends ProviderBase<State>>
implements FamilyOverride<State> {
/// An [Override] for families
// ignore: library_private_types_in_public_api
FamilyOverrideImpl(this.overriddenFamily, this._newCreate);
final FamilyProvider Function(Arg arg) _newCreate;
@override
// ignore: library_private_types_in_public_api
final _FamilyMixin<State, Arg, FamilyProvider> overriddenFamily;
@visibleForOverriding
@override
ProviderBase<State> getProviderOverride(ProviderBase<State> provider) {
final arg = provider.argument as Arg;
return _newCreate(arg);
}
}
/// A base implementation for [Family], used by the various providers to
/// help them define a [Family].
///
/// This API is not meant for public consumption.
@internal
class FamilyBase<RefT extends Ref<R>, R, Arg, Created,
ProviderT extends ProviderBase<R>> extends Family<R>
with _FamilyMixin<R, Arg, ProviderT> {
/// A base implementation for [Family], used by the various providers to
/// help them define a [Family].
///
/// This API is not meant for public consumption.
FamilyBase(
this._createFn, {
required ProviderT Function(
Create<Created, RefT> create, {
String? name,
Family from,
Object? argument,
List<ProviderOrFamily>? dependencies,
})
providerFactory,
required this.name,
required this.dependencies,
}) : _providerFactory = providerFactory;
final ProviderT Function(
Create<Created, RefT> create, {
String? name,
Family from,
Object? argument,
List<ProviderOrFamily>? dependencies,
}) _providerFactory;
final Created Function(RefT ref, Arg arg) _createFn;
@override
ProviderT call(Arg argument) => _providerFactory(
(ref) => _createFn(ref, argument),
name: name,
from: this,
argument: argument,
dependencies: dependencies,
);
@override
final String? name;
@override
final List<ProviderOrFamily>? dependencies;
@override
late final List<ProviderOrFamily>? allTransitiveDependencies =
dependencies == null ? null : _allTransitiveDependencies(dependencies!);
}
/// A base implementation for [Family], used by the various providers to
/// help them define a [Family].
///
/// This API is not meant for public consumption.
@internal
class AutoDisposeFamilyBase<RefT extends Ref<R>, R, Arg, Created,
ProviderT extends ProviderBase<R>> extends Family<R>
with _FamilyMixin<R, Arg, ProviderT> {
/// A base implementation for [Family], used by the various providers to
/// help them define a [Family].
///
/// This API is not meant for public consumption.
AutoDisposeFamilyBase(
this._createFn, {
required ProviderT Function(
Create<Created, RefT> create, {
String? name,
Family from,
Object? argument,
List<ProviderOrFamily>? dependencies,
})
providerFactory,
required this.name,
required this.dependencies,
}) : _providerFactory = providerFactory;
final ProviderT Function(
Create<Created, RefT> create, {
String? name,
Family from,
Object? argument,
List<ProviderOrFamily>? dependencies,
}) _providerFactory;
final Created Function(RefT ref, Arg arg) _createFn;
@override
ProviderT call(Arg argument) => _providerFactory(
(ref) => _createFn(ref, argument),
name: name,
from: this,
argument: argument,
dependencies: dependencies,
);
@override
final String? name;
@override
final List<ProviderOrFamily>? dependencies;
@override
late final List<ProviderOrFamily>? allTransitiveDependencies =
dependencies == null ? null : _allTransitiveDependencies(dependencies!);
}
/// A base implementation for [Family] specific to autoDispose `Notifier`-based providers.
///
/// It offers a unique "create" function which does not take any argument.
///
/// This API is not meant for public consumption.
@internal
class AutoDisposeNotifierFamilyBase<RefT extends Ref<R>, R, Arg, NotifierT,
ProviderT extends ProviderBase<R>> extends Family<R>
with _FamilyMixin<R, Arg, ProviderT> {
/// A base implementation for [Family], used by the various providers to
/// help them define a [Family].
///
/// This API is not meant for public consumption.
AutoDisposeNotifierFamilyBase(
this._createFn, {
required ProviderT Function(
NotifierT Function() create, {
String? name,
Family from,
Object? argument,
List<ProviderOrFamily>? dependencies,
})
providerFactory,
required this.name,
required this.dependencies,
}) : _providerFactory = providerFactory;
final ProviderT Function(
NotifierT Function() create, {
String? name,
Family from,
Object? argument,
List<ProviderOrFamily>? dependencies,
}) _providerFactory;
final NotifierT Function() _createFn;
@override
ProviderT call(Arg argument) => _providerFactory(
_createFn,
name: name,
from: this,
argument: argument,
dependencies: dependencies,
);
@override
final String? name;
@override
final List<ProviderOrFamily>? dependencies;
@override
late final List<ProviderOrFamily>? allTransitiveDependencies =
dependencies == null ? null : _allTransitiveDependencies(dependencies!);
}
/// A base implementation for [Family] specific to `Notifier`-based providers.
///
/// It offers a unique "create" function which does not take any argument.
///
/// This API is not meant for public consumption.
@internal
class NotifierFamilyBase<RefT extends Ref<R>, R, Arg, NotifierT,
ProviderT extends ProviderBase<R>> extends Family<R>
with _FamilyMixin<R, Arg, ProviderT> {
/// A base implementation for [Family], used by the various providers to
/// help them define a [Family].
///
/// This API is not meant for public consumption.
NotifierFamilyBase(
this._createFn, {
required ProviderT Function(
NotifierT Function() create, {
String? name,
Family from,
Object? argument,
List<ProviderOrFamily>? dependencies,
})
providerFactory,
required this.name,
required this.dependencies,
}) : _providerFactory = providerFactory;
final ProviderT Function(
NotifierT Function() create, {
String? name,
Family from,
Object? argument,
List<ProviderOrFamily>? dependencies,
}) _providerFactory;
final NotifierT Function() _createFn;
@override
ProviderT call(Arg argument) => _providerFactory(
_createFn,
name: name,
from: this,
argument: argument,
dependencies: dependencies,
);
@override
final String? name;
@override
final List<ProviderOrFamily>? dependencies;
@override
late final List<ProviderOrFamily>? allTransitiveDependencies =
dependencies == null ? null : _allTransitiveDependencies(dependencies!);
}