Getx를 사용한 플러터 프로젝트에서 Rx 변수를 선언할 때, 특정 타입이나 var 보다는 아래 코드처럼 final로 선언해주는 경우가 많습니다.
RxString name = 'Minji'.obs;
var name = 'Minji'.obs;
final name = 'Minji'.obs; // Recommended
처음에 GetX Observable에 대해서 잘 몰랐을 때는 '해당 변수는 값이 재할당 되어야 하는데 왜 final로 선언되어야 하지? 그리고 final로 선언했음에도 왜 새로운 값이 할당되는 게 가능하지?'라는 의문을 가졌던 것 같습니다. 오늘 이것에 대해서 잠깐 알아보는 시간을 가졌고, 이 글을 통해 짧게 공유하고자 합니다.
먼저 GetX에서 .obs
는 Observable 변수를 선언하는데 사용됩니다. Observable 변수는 상태를 관찰하고, 변경이 감지되면 해당 변수를 구독하고 있는 위젯들에게 알려 UI가 자동으로 업데이트 되게 합니다.
위 코드에서 변수 name은 final로 선언되었기 때문에 새로운 값이 할당될 수 없을 것처럼 보이지만, 사실은 실제 값이 아닌 실제 값을 감싸고 있는 Observable 객체입니다. 이 객체는 변하지 않으며, 우리가 .value
를 통해 변경하는 값은 Observable 객체 내부의 값입니다. 따라서 아래 코드가 문제없이 작동하는 것입니다.
final name = 'Minji'.obs;
name.value = 'Hazel';
마찬가지로, Rx 변수를 직접 변경하는 것은 불가능합니다.
대부분의 경우 Observable 자체를 변경할 일은 없으므로, 코드 안정성을 높이기 위해 특수한 경우가 아니라면 Rx 변수를 final로 선언하는 것이 권장됩니다.
Getx - Observable and reactive variables can not be final #3256
lom.log - Flutter Obx obs