Flutter의 onGenerateRoute는 동적으로 라우트를 생성할 때 사용됩니다. 앱이 요청한 경로가 정의된 routes에 없을 경우, 또는 경로와 관련된 추가 논리가 필요할 때 활용할 수 있습니다.
onGenerateRoute는 앱의 라우트가 요청될 때 실행되는 콜백 함수입니다.RouteSettings 객체를 기반으로 적절한 Route를 반환해야 합니다.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(),
);
},
);
onGenerateRouteRoute<dynamic>? Function(RouteSettings settings)
RouteSettings settings: 경로와 관련된 정보를 포함하는 객체.settings.name: 요청된 경로 이름.settings.arguments: 전달된 인자(객체).Route<dynamic>: 다음 화면으로 이동하기 위한 경로 객체. 일반적으로 MaterialPageRoute 또는 CupertinoPageRoute를 반환합니다.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(),
);
}
routes 속성보다 유연하게 경로를 관리할 수 있습니다.onGenerateRoute를 사용할 때는 모든 가능한 경로를 처리하도록 설계해야 합니다.