Dart 是通过引用传递的吗?

Ans*_*llC 4 dart flutter

在这篇文章中:Flutter video_player dispose

我问如何处理一些东西,以便我可以再次使用它。提供的答案工作正常,但它给我留下了这个问题:

为什么这段代码按预期工作?例如,它处理旧实例videoController使用oldController

final oldController = videoController;

  WidgetsBinding.instance.addPostFrameCallback((_) async {
    await oldController.dispose();

    _initController(link); //contains reassignment of videoController = VideoController.network(...)
  });
Run Code Online (Sandbox Code Playgroud)

在 C 或类似语言中,需要使用指针(或者我应该说我的首选方式)。要传递引用,请为其分配一个新值,然后处理旧值。

Igo*_*din 5

抱歉,我的回答让您感到困惑。是的,在 Dart 中,您可以使用对对象的引用,就像在 Java 中一样。我将举一个简短的例子,让你清楚为什么这段代码能按预期工作:

void main() {
  final t = Test(Test());
  t.removeField();
}

class Test {
  Test t;

  Future<void> removeField() async {
    print('current field: $t');

    Future.delayed(Duration(seconds: 2)).then((_) => print('delayed value: $t'));
    t = null;
  }

  Test([this.t]);
}
Run Code Online (Sandbox Code Playgroud)

印刷:

current field: Instance of 'Test'
delayed value: null
Run Code Online (Sandbox Code Playgroud)

在这种情况下,字段的值首先设置为 null,然后在 2 秒后执行回调。它访问对象的字段,但它已经为空。但是如果我们这样做:

current field: Instance of 'Test'
delayed value: null
Run Code Online (Sandbox Code Playgroud)

它打印:

current field: Instance of 'Test'
delayed value: Instance of 'Test'
Run Code Online (Sandbox Code Playgroud)

我们存储了该字段的先前值并将其传递给回调,因此它不会访问空字段。


归档时间:

查看次数:

7479 次

最近记录:

4 年,11 月 前