1. ホーム
  2. flutter

[解決済み] Dartは参照渡しになりますか?[重複あり]

2022-02-15 03:50:40

質問

この記事の中で Flutter video_player ディスポーザブル

何かを廃棄して、再び使用できるようにする方法を尋ねました。提供された回答は正しく機能しますが、この質問が残りました。

このコードはなぜ意図したとおりに動作するのでしょうか? videoController を使って oldController

final oldController = videoController;

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

    _initController(link); //contains reassignment of videoController = VideoController.network(...)
  });

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]);
}

を印刷します。

current field: Instance of 'Test'
delayed value: null

この場合、まずfieldの値がnullに設定され、その2秒後にコールバックが実行されます。オブジェクトのフィールドにアクセスするのだが、すでにnullになっている。しかし、このようにすると

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

と表示されます。

current field: Instance of 'Test'
delayed value: Instance of 'Test'

フィールドの前の値を保存してコールバックに渡しているので、NULLになったフィールドにアクセスすることはありません。