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