문제상황
결제시스템에 결제 요청을 보내고, 결제가 성공 -> 서버 DB 작업까지 완료되면, 특정 페이지로 이동하게 하는 로직을 구현하고자 했다. 이때 Navigator.push를 사용했는데, 평소에는 정상적으로 작동하던,, context에 빨간줄이 뜨기 시작했고 실행이 안됐다.

나는 서버요청 코드와 UI를 분리하고싶어서, 따로 서버요청 class를 만들어뒀고, 여기서 결제승인이 끝나면, 원래UI가 아닌 다른 UI로 이동하고 싶어서 Navigator.push를 썻다.
그런데, 위처럼 Undefined name 'context'가 뜨며 , context가 뭔데???를 시전하기 시작
문제 원인은,,, 나의 무지에 있었ㄷ ㅏ
매번 ui와 서버요청코드를 분리하지 않고 한번에 때려넣었던 잘못도 있었고,
제대로 개념을 익히지않고 이것저것 만들어야지~ 이러면서 강행했던 잘못도.....
아무튼 문제의 원인은 context는 flutter 위젯트리에서 BuildContext를 참조하는 객체이므로, Navigator를 정의한 함수가 StatelessWidget이나 StatefulWidget내부에 없다면 context를 직접사용할 수 없다는 것이다.
이게 뭔뜻이냐하면
buildContext는 위젯 트리에서 특정 위젯이 어디에 위치하는지를 나타내는 정보 (위치정보)를 포함하는 객체이다.
즉, BuildContext는 위젯트리내에서의 각 위젯의 위치정보를 갖고있기에, 화면을 업데이트하거나 ! 다른 위젯으로 이동할 때! 필요하다.
그렇기에 위젯이 "빌드되는 과정 안"에서만 접근이 가능하다.
결국 statelessWidget과 statefulWidget에서만 context를 사용할 수 있는 이유도, 이들이 위젯트리를 만드는, 화면을 만드는 요소들, build 함수안에서 생성된 위젯의 일부이기 때문이다.
내 코드와 같이 static 함수 등은 위젯 트리안에서 실행되는 것도 아니고, 화면을 직접적으로 만드는 것도 아니기에, context를 알 수 없다.
그럼 해결 방법은 무엇이냐? 하면
간단하다.
ui에서 해당 함수를 불러올때, context객체를 매개변수로 전달하면 된다.
await PaymentService.sendPaymentConfirmation(context,flightOrderId);
위와 같이 함수 호출할때, context를 함께 넘겨주고,
static Future<void> sendPaymentConfirmation(BuildContext context, int orderId) async { final url = Uri.parse("http://10.0.2.2:8081/order/confirm");
메서드에서도 BuildContext를 받으면 해결 !_!
정말 쉬운 개념,, 당연한 개념이었는데, 이제야 알았다는 것에 반성한다.. 좀 더 성의있게 프로젝트를 만들고, 잘좀 배워보자