Skip to content

Commit 62b4e03

Browse files
fix/25 (#26)
* fix/25 * refactor: logic * chore: add test * chore: update code * chore: revert dispose --------- Co-authored-by: Manuel Plavsic <55398763+manuel-plavsic@users.noreply.github.com>
1 parent 286a773 commit 62b4e03

File tree

4 files changed

+31
-13
lines changed

4 files changed

+31
-13
lines changed

packages/disco/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 1.0.3
2+
3+
- **FIX**: Disposal of provider with arguments.
4+
15
## 1.0.2
26

37
- **FIX**: A bug prevented users to inject providers with arguments from a `ProviderScope` which was placed inside a `ProviderScopePortal`.

packages/disco/lib/src/widgets/provider_scope.dart

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -206,16 +206,15 @@ class ProviderScopeState extends State<ProviderScope> {
206206

207207
for (final instantiableArgProvider in instantiableArgProviders) {
208208
final id = instantiableArgProvider._argProvider;
209-
allArgProvidersInScope[id] = instantiableArgProvider._argProvider
210-
._generateIntermediateProvider(instantiableArgProvider._arg);
211-
209+
final provider =
210+
instantiableArgProvider._argProvider._generateIntermediateProvider(
211+
instantiableArgProvider._arg,
212+
);
213+
allArgProvidersInScope[id] = provider;
212214
// create non lazy providers.
213215
if (!instantiableArgProvider._argProvider._lazy) {
214-
// the intermediate ID is a reference to the associated generated
215-
// intermediate provider
216-
final intermediateId = allArgProvidersInScope[id]!;
217216
// create and store the provider
218-
createdProviderValues[intermediateId] =
217+
createdProviderValues[provider] =
219218
allArgProvidersInScope[id]!._createValue(context);
220219
}
221220
}
@@ -296,7 +295,7 @@ class ProviderScopeState extends State<ProviderScope> {
296295
void dispose() {
297296
// dispose all the created providers
298297
createdProviderValues.forEach((key, value) {
299-
allProvidersInScope[key]?._safeDisposeValue(value);
298+
key._safeDisposeValue(value);
300299
});
301300

302301
allArgProvidersInScope.clear();

packages/disco/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: disco
22
description: A Flutter library bringing a new concept of scoped providers for dependency injection, which are independent of any specific state management solution.
3-
version: 1.0.2
3+
version: 1.0.3
44
repository: https://github.com/our-creativity/disco
55
homepage: https://disco.mariuti.com
66
documentation: https://disco.mariuti.com

packages/disco/test/disco_test.dart

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,8 @@ void main() {
273273
testWidgets('Test provider injection', (tester) async {
274274
final NameContainer nameContainer = MockNameContainer('Ale');
275275

276+
var fullNameContainerProviderDisposed = false;
277+
276278
final numberContainer1Provider = Provider(
277279
(_) => const NumberContainer(1),
278280
lazy: false,
@@ -285,6 +287,12 @@ void main() {
285287
(_) => nameContainer,
286288
dispose: (provider) => provider.dispose(),
287289
);
290+
final fullNameContainerProvider = Provider.withArgument(
291+
(_, String surname) => MockNameContainer('John $surname'),
292+
dispose: (provider) {
293+
fullNameContainerProviderDisposed = true;
294+
},
295+
);
288296

289297
await tester.pumpWidget(
290298
MaterialApp(
@@ -294,32 +302,39 @@ void main() {
294302
nameContainerProvider,
295303
numberContainer1Provider,
296304
numberContainer2Provider,
305+
fullNameContainerProvider('Smith'),
297306
],
298307
child: Builder(
299308
builder: (context) {
300309
final nameContainer = nameContainerProvider.of(context);
301310
final numberContainer1 = numberContainer1Provider.of(context);
302311
final numberContainer2 = numberContainer2Provider.of(context);
312+
final fullNameContainer = fullNameContainerProvider.of(context);
303313
return Text(
304-
'''${nameContainer.name} ${numberContainer1.number} ${numberContainer2.number}''',
314+
'''${nameContainer.name} ${numberContainer1.number} ${numberContainer2.number} ${fullNameContainer.name}''',
305315
);
306316
},
307317
),
308318
),
309319
),
310320
),
311321
);
312-
Finder providerFinder(String value1, int value2, int value3) =>
313-
find.text('$value1 $value2 $value3');
322+
Finder providerFinder(
323+
String value1, int value2, int value3, String value4) =>
324+
find.text('$value1 $value2 $value3 $value4');
314325

315-
expect(providerFinder('Ale', 1, 100), findsOneWidget);
326+
expect(providerFinder('Ale', 1, 100, 'John Smith'), findsOneWidget);
316327

317328
// mock NameProvider dispose method
318329
when(nameContainer.dispose()).thenReturn(null);
330+
// Check that the dispose method in the provider with argument is not called
331+
expect(fullNameContainerProviderDisposed, false);
319332
// Push a different widget
320333
await tester.pumpWidget(Container());
321334
// check dispose has been called on NameProvider
322335
verify(nameContainer.dispose()).called(1);
336+
// check that the dispose method in the provider with argument is called
337+
expect(fullNameContainerProviderDisposed, true);
323338
});
324339

325340
testWidgets('Test ProviderScopePortal works', (tester) async {

0 commit comments

Comments
 (0)