错误:TimeoutException Future 未完成并且 TypeError:T.as 不是 _Future.new 的函数。[_setValue]

Posted

技术标签:

【中文标题】错误:TimeoutException Future 未完成并且 TypeError:T.as 不是 _Future.new 的函数。[_setValue]【英文标题】:Error: TimeoutException Future not completed And TypeError: T.as is not a function at _Future.new.[_setValue] 【发布时间】:2020-10-07 00:47:43 【问题描述】:

我在处理 Flutter web 和 Firebase 存储时遇到了这个错误:

错误:0:00:05.000000 之后的 TimeoutException:未来未完成 在 Object.createErrorWithStack (http://localhost:65534/dart_sdk.js:4478:12) 在 Object._rethrow (http://localhost:65534/dart_sdk.js:37394:16) 在 async._AsyncCallbackEntry.new.callback (http://localhost:65534/dart_sdk.js:37388:13)

然后是这个错误(总是成对的)

TypeError: T.as 不是函数 在 _Future.new.[_setValue] (http://localhost:60098/dart_sdk.js:32317:11) 在 Function._propagateToListeners (http://localhost:60098/dart_sdk.js:32660:30) 在 async._AsyncCallbackEntry.new.callback (http://localhost:60098/dart_sdk.js:32357:27) 在 Object._microtaskLoop (http://localhost:60098/dart_sdk.js:37220:13) 在 _startMicrotaskLoop (http://localhost:60098/dart_sdk.js:37226:13) 在http://localhost:60098/dart_sdk.js:32848:9

我花了整整 2 天的时间来弄清楚这是从哪里来的。

据我所知,到目前为止,它似乎来自我将图像上传到 Firebase 存储时:

代码如下:

final uploadTask = _storageRef.child(_path).put(_file,
    fb.UploadMetadata(
        contentType: _file.type, customMetadata: customMetaData));

// Listening to the progress.
final StreamSubscription<fb.UploadTaskSnapshot> stream =
    uploadTask.onStateChanged.listen((event) => event);

stream.onDone(() 
  uploadTask.cancel();
  stream.cancel();
);

如果有人问,这是我的flutter doctor -v

[✓] Flutter (Channel dev, 1.20.0-0.0.pre, on Mac OS X 10.15.5 01, locale
    en-US)
    • Flutter version 1.20.0-0.0.pre at /Applications/flutter
    • Framework revision d9653445f4 (7 days ago), 2020-06-09 18:43:03 -0400
    • Engine revision e8c13aa012
    • Dart version 2.9.0 (build 2.9.0-14.0.dev 5c1376615e)
    • Pub download mirror https://pub.flutter-io.cn
    • Flutter download mirror https://storage.flutter-io.cn


[✓] android toolchain - develop for Android devices (Android SDK version 29.0.3)
    • Android SDK at /Applications/Android/sdk
    • Platform android-29, build-tools 29.0.3
    • ANDROID_HOME = /Applications/Android/sdk
    • Java binary at: /Applications/Android
      Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build
      1.8.0_242-release-1644-b3-6222593)
    • All Android licenses accepted.

[✓] Xcode - develop for ios and macOS (Xcode 11.4.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 11.4.1, Build version 11E503a
    • CocoaPods version 1.9.1

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 4.0)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 47.0.2-dev.2
    • Dart plugin version 193.7361
    • Java version OpenJDK Runtime Environment (build
      1.8.0_242-release-1644-b3-6222593)

[✓] VS Code (version 1.46.0)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.11.0

[✓] Connected device (2 available)
    • Web Server • web-server • web-javascript • Flutter Tools
    • Chrome     • chrome     • web-javascript • Google Chrome 83.0.4103.106

• No issues found!

感谢任何帮助。谢谢

【问题讨论】:

我遇到了同样的错误。你弄明白了吗? 【参考方案1】:

我也遇到了这个问题;这似乎是由 dart 的 JS-interop 功能中的一些怪癖引起的(我在 dart-lang/sdk 中创建了一个问题,试图得到一些澄清!)

此特定问题的根本原因是 UploadTask 类 here 中 onStateChanged 流的内部实现存在问题。

原始代码将 UploadTask 的 onCompletion 回调定义为:

var onCompletion = allowInterop(() => _changeController.close());

但无论.close() 返回的是unexpected in the js-interop layer 并导致此崩溃,所以我将其替换为:

var onCompletion = allowInterop(() 
  _changeController.close();
);

至少在我正在开发的 firebase_storage_web 插件上,这成功了!

已修复published as firebase:^7.3.1

PS:看看package:firebase 代码,我敢打赌,如果他们使用uploadTask.future 而不是uploadTask.onStateChanged,OP 不会有任何问题,但是当然你不能有上传进度。 Docs.

【讨论】:

以上是关于错误:TimeoutException Future 未完成并且 TypeError:T.as 不是 _Future.new 的函数。[_setValue]的主要内容,如果未能解决你的问题,请参考以下文章

错误:TimeoutException Future 未完成并且 TypeError:T.as 不是 _Future.new 的函数。[_setValue]

TimeoutException:获取主题元数据Kafka时超时

使用 BehaviorSubject 的测试中的 TimeoutException - BLoC

STS 和 org.eclipse.jdi.TimeoutException 中的远程调试

selenium.common.exceptions.TimeoutException: Message: Screenshot: available via screen

after_step中的HOOK-ERROR:TimeoutException:消息:超时