我试图在主通道的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)的文档在这种情况下基本无济于事,文档中显示的示例方法似乎在这里不起作用
如何在没有出现此异常的情况下正确设置AutoRefreshingAuthClient
和FirestoreAPI
对象?
这是一个渡槽项目,如果我只是在创建时运行该项目附带的示例代码,就不会有问题。
我尝试将调用和初始化转移到不同的范围,但是除此之外,我不知道该怎么做。
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
调用。