junior developer :)/Flutter & Dart

[flutter]GetX Error(obx/the improper use of a GetX has been detected 오류)

ㅁ윤슬ㅁ 2023. 6. 29. 16:57
728x90
반응형

현재 진행중인 플러터 프로젝트에서는 상태관리로 getx를 사용하고 있다.

getx는 controller, view, bindings 파일로 구성되어 있는데, view는 화면에 그려주는 역할, controller는 비즈니스 로직을 포함하고 상태를 관리하는 역할, bindings은 view와 controller을 연결해주는 역할을 한다.

변수나 함수도 controller에 포함되어 있기 때문에, 변수를 화면에 출력하기 위해서는 view에서 controller에 있는 변수를 가지고 와야 한다.

//controller.dart
RxString value = ''.obs; // RxString은 GexX라이브러리에서 제공하며 특정 데이터의 변경을 자동으로 감지하는 반응형 변수


//view.dart
Obx(() {
	return Expanded(
       child: Text(
         controller.content.value,
         style: const TextStyle(fontSize: 20),
       ),
     );
   }),

위 처럼 관찰가능한 변수를 정의해 줄 때는 obs메소드를 이용하여 해당 변수가 반응형 변수임을 말해줘야 한다.
반응형 변수를 적을 때는 일반 데이터 타입이 아닌 앞에 Rx가 붙은 데이터 타입을 이용해야 한다.

관찰 가능한 변수를 실제 view에서 출력해 줄 때는 obx함수로 감싸 줘야 관찰가능한 변수를 구독하고 있을 수가 있다. 


이 페이지에서도 controller안에서 변수를 가져와야 할일이 두 곳에서 있었다.

두 곳 다 obx로 묶고 보니 아래와 같은 오류가 발생했다.

오류를 보니 GetX의 잘못된 사용이 탐지되었다는 것...

현재는 오류가 옆으로 밀려 잘 보이지 않지만 이번 프로젝트를 진행하면서 많이 봐왔던 오류였기 때문에 무엇이 문제인지는 빠르게 캐치할 수 있었다.
요약하면 업데이트할 특정 위젯에서만 GetX 또는 obx를 사용해야 한다. 즉, obx 함수 안에 관찰가능한 함수가 없다는 것이였다.

코드를 다시 보니 전 페이지에서 값을 받아오는 변수를 포함한 코드가 obx 함수 안에 있었다.
하지만 argument를 받아오는 변수는 한 번 받아오면 변화가 생길일도 없고, 그렇기 때문에 변수를 설정해줄 때도 obs(관찰가능한 값)으로 지정해주지 않았다.
그래서 obx는 관찰해야 할 변수를 찾지 못 해 나타났던 오류였다.

obx widget을 제거하고 나니 해결 !


구독하지 않을(관찰이 필요 없는) 일반 변수들은 obx로 감싸 줄 필요도 없고, 함수를 실행할 때도 obx 밖에서 실행시켜도 무관하다.
처음 getx를 적용했을 때는 controller에 있는 변수/함수를 이용할 때 무조건 obx함수가 동행되어야 한다고 잘 못 생각했었던 적도 있었는데 같은 오류 몇 번 겪고 나니 확실히 이해할 수 있었던 것 같다.

728x90
반응형