[Flutter] GoRouter + GetxController

Raon·2023년 1월 11일
2

Flutter

목록 보기
8/25
post-custom-banner
  • GoRouter와 GetX를 사용할 때 GetPage를 사용하지 못하다보니 원래 사용해오던 Getx의 바인딩을 사용하지 못하는 문제가 발생했다.

  • 해결방법 : GetBuilder를 통해 바인딩을 직접 지정해줘야한다.

void main() => runApp(MyApp());

final GoRouter router = GoRouter(
  initialLocation: '/some/path',
  routes: [
    /* some path */
    GoRoute(
      path: '/some/path',
      builder: (context, state) => GetBuilder(
        init: SomeController(),
        dispose: (state) {
          Get.delete<SomeController>();
        },
        builder: (controller) => SomePage(),
      ),
    ),
  ],
);

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return GetMaterialApp.router(
      routeInformationParser: router.routeInformationParser,
      routeInformationProvider: router.routeInformationProvider,
      routerDelegate: router.routerDelegate,
      backButtonDispatcher: router.backButtonDispatcher,
    );
  }
}

class SomePage extends GetView<SomeController> {
  
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Obx(() => Text(controller.hello.value)),
      ),
    );
  }
}

class SomeController extends GetxController {
  final RxString hello = 'Hello Hello'.obs;

  
  void onReady() {
    Future.delayed(const Duration(seconds: 2)).then((_) {
      hello.value = 'Bye Bye';
    });
  }
}
  • 이런 방식으로 호출하면 된다. builder가 두 번 사용되는 형태가 바람직해 보이지는 않지만 Getx에서 제공되는 라우팅을 사용하지 않고 GoRouter와 섞어 사용하기 위해선 어쩔 수 없어 보인다.

  • dispose에 Get.delete를 선언하면 페이지에서 빠져 나올 때 컨트롤러를 메모리에서 제거한다.

profile
Flutter 개발자
post-custom-banner

2개의 댓글

comment-user-thumbnail
2023년 3월 22일

혹시 GoRouter와 Getx를 같이 사용하시는 이유가 있으신가요?

1개의 답글