«Плохое состояние: будущее уже завершено» в акведуке - PullRequest
2 голосов
/ 06 апреля 2019

Я пытаюсь в методе 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 вызов.

...