【问题标题】:Difference between Object.methodName() and Object..methodName() dartObject.methodName() 和 Object..methodName() 飞镖之间的区别
【发布时间】:2020-04-01 20:12:19
【问题描述】:

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

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

为什么他们使用 ..initialize() 而不是 .initialize() ? 我尝试在我的项目中使用相同的代码,但如果我使用 ..initialize() ,IDE 不允许我使用 await 关键字

'await' 应用于'VideoPlayerController',它不是'Future'.dart(await_only_futures)

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

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

谢谢

【问题讨论】:

    标签: flutter dart async-await video-player


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 如果你使用 await VideoPlayerController.file(_video).initialize();你会得到同样的结果吗?因为 await 不返回 Future 而是返回对象引用。
    • 不,因为initialize()的返回值是Future<null>所以如果你使用await的结果你会得到null:pub.dev/documentation/video_player/latest/video_player/…
    • 我收到了 null 错误,但我不知道为什么。非常感谢您的帮助:)
    猜你喜欢
    • 2011-11-18
    • 2023-03-11
    • 2010-11-28
    • 2019-10-12
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2012-04-04
    相关资源
    最近更新 更多