错误: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