渡槽中的“不良状态:未来已经完成”

时间:2019-04-06 03:03:13

标签: dart aqueduct

我试图在主通道的prepare方法中加载一个AutoRefreshingAuthClient和随后的一个FirestoreAPI对象,但是我得到了以下堆栈跟踪: / p>

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)的文档在这种情况下基本无济于事,文档中显示的示例方法似乎在这里不起作用

如何在没有出现此异常的情况下正确设置AutoRefreshingAuthClientFirestoreAPI对象?

这是一个渡槽项目,如果我只是在创建时运行该项目附带的示例代码,就不会有问题。

我尝试将调用和初始化转移到不同的范围,但是除此之外,我不知道该怎么做。

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调用。

0 个答案:

没有答案