Flutter의 onGenerateRoute

국정무·2025년 1월 17일

Flutter의 onGenerateRoute동적으로 라우트를 생성할 때 사용됩니다. 앱이 요청한 경로가 정의된 routes에 없을 경우, 또는 경로와 관련된 추가 논리가 필요할 때 활용할 수 있습니다.


1. 기본 개념

  • onGenerateRoute는 앱의 라우트가 요청될 때 실행되는 콜백 함수입니다.
  • 이 함수는 RouteSettings 객체를 기반으로 적절한 Route를 반환해야 합니다.
  • 동적으로 경로를 정의하거나 특정 경로가 없을 때 대체 라우트를 제공하는 데 유용합니다.

2. 정의 방식

MaterialApp 또는 CupertinoApp에서 onGenerateRoute를 설정합니다.

MaterialApp(
  initialRoute: '/',
  onGenerateRoute: (settings) {
    // 경로와 관련된 로직 작성
    if (settings.name == '/second') {
      return MaterialPageRoute(
        builder: (context) => SecondScreen(),
      );
    } else if (settings.name == '/third') {
      final args = settings.arguments as String;
      return MaterialPageRoute(
        builder: (context) => ThirdScreen(data: args),
      );
    }
    // 알 수 없는 경로 처리
    return MaterialPageRoute(
      builder: (context) => NotFoundScreen(),
    );
  },
);

3. 주요 파라미터

onGenerateRoute

Route<dynamic>? Function(RouteSettings settings)
  • RouteSettings settings: 경로와 관련된 정보를 포함하는 객체.
    • settings.name: 요청된 경로 이름.
    • settings.arguments: 전달된 인자(객체).

반환값

  • Route<dynamic>: 다음 화면으로 이동하기 위한 경로 객체. 일반적으로 MaterialPageRoute 또는 CupertinoPageRoute를 반환합니다.

4. 예제 코드

화면 정의

class SecondScreen extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Second Screen')),
      body: Center(child: Text('Welcome to the second screen!')),
    );
  }
}

class ThirdScreen extends StatelessWidget {
  final String data;

  ThirdScreen({required this.data});

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Third Screen')),
      body: Center(child: Text('Data: $data')),
    );
  }
}

class NotFoundScreen extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('404')),
      body: Center(child: Text('Page not found')),
    );
  }
}

라우트 생성

MaterialApp(
  initialRoute: '/',
  onGenerateRoute: (RouteSettings settings) {
    switch (settings.name) {
      case '/':
        return MaterialPageRoute(builder: (context) => HomeScreen());
      case '/second':
        return MaterialPageRoute(builder: (context) => SecondScreen());
      case '/third':
        if (settings.arguments is String) {
          return MaterialPageRoute(
            builder: (context) => ThirdScreen(data: settings.arguments as String),
          );
        }
        return _errorRoute(); // 에러 화면 처리
      default:
        return _errorRoute(); // 알 수 없는 경로 처리
    }
  },
);

에러 처리 라우트

Route<dynamic> _errorRoute() {
  return MaterialPageRoute(
    builder: (context) => NotFoundScreen(),
  );
}

5. 장점

  • 동적 라우팅: 정적으로 정의된 routes 속성보다 유연하게 경로를 관리할 수 있습니다.
  • 오류 처리: 잘못된 경로 요청 시 사용자 정의 에러 화면을 표시할 수 있습니다.
  • 추가 논리 처리: 경로에 따라 조건부 로직을 쉽게 추가할 수 있습니다.

6. 주의사항

  • onGenerateRoute를 사용할 때는 모든 가능한 경로를 처리하도록 설계해야 합니다.
  • 잘못된 경로 요청에 대비해 기본값(에러 화면)을 반환하도록 설정하는 것이 중요합니다.
profile
악바리 개발자

0개의 댓글