Я пытаюсь в методе prepare
основного канала загрузить объект AutoRefreshingAuthClient
, а затем и FirestoreAPI
, но получаю следующую трассировку стека:
Unhandled exception:
Bad state: Future already completed
#0 _Completer.completeError (dart:async/future_impl.dart:21:31)
#1 ApplicationIsolateSupervisor._handleIsolateException (package:aqueduct/src/application/isolate_supervisor.dart:129:24)
#2 ApplicationIsolateSupervisor.listener (package:aqueduct/src/application/isolate_supervisor.dart:102:7)
#3 _RootZone.runUnaryGuarded (dart:async/zone.dart:1314:10)
#4 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:336:11)
#5 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:263:7)
#6 _SyncStreamController._sendData (dart:async/stream_controller.dart:764:19)
#7 _StreamController._add (dart:async/stream_controller.dart:640:7)#8 _StreamController.add (dart:async/stream_controller.dart:586:5)
#9 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)
Хотя эта трассировка стека не указывает ни на что в моем коде, я изолировал проблему с ожидаемым вызовом clientViaServiceAccount
(код ниже) в методе prepare
.
Я не уверен относительно того, чтоЯ делаю неправильно, поскольку документация для этого API ( googleapis ) в этом контексте в значительной степени бесполезна, и пример метода, показанный в документации, здесь не работает.
Как правильно настроить объекты AutoRefreshingAuthClient
и FirestoreAPI
без получения этого исключения?
Это проект Aqueduct, который не вызывает проблем при запуске, если я просто запускаю пример кода, поставляемого спроект при создании.
Я пытался перенести вызовы и инициализацию на разные области, но кроме этого я не знаю, что попробовать.
channel.dart
import 'dart:io';
import 'package:googleapis/firestore/v1.dart';
import 'package:googleapis_auth/auth.dart';
import 'package:googleapis_auth/auth_io.dart';
import 'package:mm_block/mm_block.dart';
import 'package:mm_block/controller/member.dart';
final _credentials = ServiceAccountCredentials.fromJson(
File('credentials').readAsString()
);
final _scopes = [
FirestoreApi.CloudPlatformScope
];
class MMBlockChannel extends ApplicationChannel {
FirestoreApi firestore;
@override
Future prepare() async {
// The issue is here.
await clientViaServiceAccount(_credentials, _scopes)
.then((client) => firestore = FirestoreApi(client));
}
...
}
Это все должно работать правильноу, и я должен закончить с AutoRefreshingAuthClient
, передаваемым на FirestoreAPI
вызов.