Skip to content

Commit abd6786

Browse files
fix: wait for addPlugin prior to configuration (#3018)
chore: wait for addPlugin prior to configure Co-authored-by: Jordan Nelson <[email protected]>
1 parent 3bfcd45 commit abd6786

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

packages/amplify/amplify_flutter/lib/src/hybrid_impl.dart

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@ class AmplifyHybridImpl extends AmplifyClassImpl {
1414
/// {@macro amplify_flutter.amplify_hybrid_impl}
1515
AmplifyHybridImpl() : super.protected();
1616

17+
final _addPluginFutures = <Future<void>>[];
18+
1719
@override
1820
Future<void> configurePlatform(String config) async {
1921
final amplifyConfig = AmplifyConfig.fromJson(
2022
(jsonDecode(config) as Map<Object?, Object?>).cast(),
2123
);
24+
await Future.wait(_addPluginFutures);
25+
_addPluginFutures.clear();
2226
await Future.wait(
2327
[
2428
...API.plugins,
@@ -38,7 +42,13 @@ class AmplifyHybridImpl extends AmplifyClassImpl {
3842
}
3943

4044
@override
41-
Future<void> addPlugin(AmplifyPluginInterface plugin) async {
45+
Future<void> addPlugin(AmplifyPluginInterface plugin) {
46+
final future = _addPlugin(plugin);
47+
_addPluginFutures.add(future);
48+
return future;
49+
}
50+
51+
Future<void> _addPlugin(AmplifyPluginInterface plugin) async {
4252
if (isConfigured) {
4353
throw const AmplifyAlreadyConfiguredException(
4454
'Amplify has already been configured and adding plugins after configure is not supported.',

packages/amplify_core/lib/src/amplify_class_impl.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,16 @@ class AmplifyClassImpl extends AmplifyClass {
2121
final AmplifyAuthProviderRepository authProviderRepo =
2222
AmplifyAuthProviderRepository();
2323

24+
final _addPluginFutures = <Future<void>>[];
25+
2426
@override
2527
Future<void> addPlugin(AmplifyPluginInterface plugin) {
28+
final future = _addPlugin(plugin);
29+
_addPluginFutures.add(future);
30+
return future;
31+
}
32+
33+
Future<void> _addPlugin(AmplifyPluginInterface plugin) {
2634
switch (plugin.category) {
2735
case Category.analytics:
2836
return Analytics.addPlugin(
@@ -64,6 +72,8 @@ class AmplifyClassImpl extends AmplifyClass {
6472
final amplifyConfig = AmplifyConfig.fromJson(
6573
(jsonDecode(config) as Map<Object?, Object?>).cast(),
6674
);
75+
await Future.wait(_addPluginFutures);
76+
_addPluginFutures.clear();
6777
await Future.wait(
6878
[
6979
...Analytics.plugins,
@@ -83,6 +93,7 @@ class AmplifyClassImpl extends AmplifyClass {
8393

8494
@override
8595
Future<void> reset() async {
96+
_addPluginFutures.clear();
8697
await Future.wait([
8798
Analytics.reset(),
8899
API.reset(),

packages/amplify_core/test/amplify_class_test.dart

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
33

4+
import 'dart:async';
5+
46
import 'package:amplify_core/amplify_core.dart';
57
import 'package:test/test.dart';
68

@@ -22,6 +24,16 @@ void main() {
2224
expect(Amplify.configure(dummyConfiguration), completes);
2325
});
2426

27+
test('plugin is configured even if addPlugin is not awaited', () async {
28+
expect(Amplify.asyncConfig, completes);
29+
final plugin = AsyncAddPlugin();
30+
unawaited(Amplify.addPlugin(plugin));
31+
expect(Amplify.Analytics.plugins.length, 0);
32+
await Amplify.configure(dummyConfiguration);
33+
expect(Amplify.Analytics.plugins.length, 1);
34+
expect(plugin.isConfigured, isTrue);
35+
});
36+
2537
test('throws for invalid JSON', () async {
2638
expect(
2739
Amplify.asyncConfig,
@@ -86,3 +98,26 @@ class SuccessPlugin extends AnalyticsPluginInterface {
8698
return;
8799
}
88100
}
101+
102+
/// A plugin that has async behavior in addPlugin.
103+
class AsyncAddPlugin extends AnalyticsPluginInterface {
104+
final _configureCompleter = Completer<void>();
105+
106+
bool get isConfigured => _configureCompleter.isCompleted;
107+
108+
@override
109+
Future<void> configure({
110+
AmplifyConfig? config,
111+
required AmplifyAuthProviderRepository authProviderRepo,
112+
}) async {
113+
_configureCompleter.complete();
114+
}
115+
116+
@override
117+
Future<void> addPlugin({
118+
required AmplifyAuthProviderRepository authProviderRepo,
119+
}) async {
120+
await super.addPlugin(authProviderRepo: authProviderRepo);
121+
await Future<void>.delayed(Duration.zero);
122+
}
123+
}

0 commit comments

Comments
 (0)