在这篇文章中: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 或类似语言中,需要使用指针(或者我应该说我的首选方式)。要传递引用,请为其分配一个新值,然后处理旧值。
抱歉,我的回答让您感到困惑。是的,在 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 次 |
| 最近记录: |