Object.methodName() 和 Object..methodName() 飞镖之间的区别

Difference between Object.methodName() and Object..methodName() dart

我在看 this 关于 image_picker 和 video_player 库的文章,我看到了下面的代码:

_videoPlayerController = VideoPlayerController.file(_video)..initialize().then((_) {
   setState(() { });
   _videoPlayerController.play();
 });

为什么他们使用 ..initialize() 而不是 .initialize() ? 我试图在我的项目中使用相同的代码,但如果我使用 ..initialize()

,IDE 不允许我使用 await 关键字

'await' applied to 'VideoPlayerController', which is not a 'Future'.dart(await_only_futures)

但是在 .initialize() 中使用 await 关键字没有问题

那么在这个例子中使用 ..initialize() 和 .initialize() 有什么区别呢?

谢谢

它被称为级联表示法,在 Dart 语言之旅中有记录: https://dart.dev/guides/language/language-tour#cascade-notation-

在您的示例中使用它的原因是因为该示例的作者希望变量 _videoPlayerController 是对 VideoPlayerController.file(_video) 而不是 [=13= 创建的对象的引用] 从 then().

返回

你也可以这样写同样的代码:

_videoPlayerController = VideoPlayerController.file(_video);

_videoPlayerController.initialize().then((_) {
   setState(() { });
   _videoPlayerController.play();
 });

所以您不能等待 VideoPlayerController.file(_video)..initialize().then( 的原因是该行的结果不是 Future 而是 VideoPlayerController 对象。