Search
Duplicate

๋„ค๋น„๊ฒŒ์ด์…˜ ์œ„์ ฏ

๋„ค๋น„๊ฒŒ์ด์…˜ ์œ„์ ฏ

โ€ข
Navigator
โ€ข
Routes
โ€ข
BottomNavigationBar
โ€ข
ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ๊ณผ ํ™”๋ฉด ์ด๋™

Navigator

์•ฑ ๋‚ด์—์„œ ํ™”๋ฉด ๊ฐ„ ์ด๋™์„ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค
Navigator ํด๋ž˜์Šค๋Š” ์•ฑ ๋‚ด์—์„œ ํ™”๋ฉด ๊ฐ„ ์ด๋™์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์ด์ „ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๋“ฑ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์ œ์–ดํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•

Navigator.push( context, MaterialPageRoute(builder: (context) => SecondScreen()), ); Navigator.pop(context);
Dart
๋ณต์‚ฌ

์˜ˆ์‹œ

โ€ข
main.dart
โ€ข
first_screen.dart
โ€ข
second_screen.dart
โ€ข
ํŒŒ์ผ ๊ตฌ์กฐ
- lib - screens - first_screen.dart - second_screen.dart - main.dart
Dart
๋ณต์‚ฌ

main.dart

import 'package:flutter/material.dart'; import 'screens/first_screen.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( home: FirstScreen(), ); } }
Dart
๋ณต์‚ฌ

first_screen.dart

import 'package:flutter/material.dart'; import 'second_screen.dart'; class FirstScreen extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('First Screen'), ), body: Center( child: ElevatedButton( onPressed: () { Navigator.push( context, MaterialPageRoute(builder: (context) => SecondScreen()), ); }, child: Text('Go to Second Screen'), ), ), ); } }
Dart
๋ณต์‚ฌ

second_screen.dart

import 'package:flutter/material.dart'; class SecondScreen extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Second Screen'), ), body: Center( child: ElevatedButton( onPressed: () { Navigator.pop(context); }, child: Text('Go back to First Screen'), ), ), ); } }
Dart
๋ณต์‚ฌ

Routes

์‚ฌ์šฉ๋˜๋Š” ๊ฐ ํ™”๋ฉด์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•˜๋Š” ์†์„ฑ

Routes๋Š” ์•ฑ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ ํ™”๋ฉด์— ๋Œ€ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. MaterialApp์˜ routes ์†์„ฑ์— ๋งต ํ˜•ํƒœ๋กœ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•

MaterialApp( routes: { '/home': (context) => HomeScreen(), '/profile': (context) => ProfileScreen(), '/settings': (context) => SettingsScreen(), }, );
Dart
๋ณต์‚ฌ

์˜ˆ์‹œ

โ€ข
main.dart
โ€ข
home_screen.dart
โ€ข
profile_screen.dart
โ€ข
settings_screen.dart
โ€ข
ํŒŒ์ผ ๊ตฌ์กฐ
- lib - screens - home_screen.dart - profile_screen.dart - settings_screen.dart - main.dart
Dart
๋ณต์‚ฌ

main.dart

import 'package:flutter/material.dart'; import 'screens/home_screen.dart'; import 'screens/profile_screen.dart'; import 'screens/settings_screen.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( initialRoute: '/home', routes: { '/home': (context) => HomeScreen(), '/profile': (context) => ProfileScreen(), '/settings': (context) => SettingsScreen(), }, ); } }
Dart
๋ณต์‚ฌ

home_screen.dart

import 'package:flutter/material.dart'; class HomeScreen extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Home Screen'), ), body: Center( child: Text('This is the Home Screen'), ), ); } }
Dart
๋ณต์‚ฌ

profile_screen.dart

import 'package:flutter/material.dart'; class ProfileScreen extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Profile Screen'), ), body: Center( child: Text('This is the Profile Screen'), ), ); } }
Dart
๋ณต์‚ฌ

settings_screen.dart

import 'package:flutter/material.dart'; class SettingsScreen extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Settings Screen'), ), body: Center( child: Text('This is the Settings Screen'), ), ); } }
Dart
๋ณต์‚ฌ

BottomNavigationBar

ํ™”๋ฉด ํ•˜๋‹จ์— ๋‚˜ํƒ€๋‚˜๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”
BottomNavigationBar๋Š” ํ™”๋ฉด ํ•˜๋‹จ์— ๋‚˜ํƒ€๋‚˜๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๋กœ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ™”๋ฉด์„ ํƒญ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ๊ฐ ํƒญ์„ ๋ˆŒ๋ €์„ ๋•Œ ํ•ด๋‹น ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•

Scaffold( body: _selectedScreen, // ํ˜„์žฌ ์„ ํƒ๋œ ํ™”๋ฉด์ด ํ‘œ์‹œ๋  ๋ถ€๋ถ„ bottomNavigationBar: BottomNavigationBar( items: [ BottomNavigationBarItem( icon: Icon(Icons.home), label: 'Home', ), BottomNavigationBarItem( icon: Icon(Icons.person), label: 'Profile', ), BottomNavigationBarItem( icon: Icon(Icons.settings), label: 'Settings', ), ], currentIndex: _selectedIndex, // ํ˜„์žฌ ์„ ํƒ๋œ ํƒญ์˜ ์ธ๋ฑ์Šค onTap: _onTabTapped, // ํƒญ์ด ๋ˆŒ๋ ธ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ), );
Dart
๋ณต์‚ฌ

์˜ˆ์‹œ

โ€ข
main.dart
โ€ข
home_screen.dart
โ€ข
profile_screen.dart
โ€ข
settings_screen.dart
โ€ข
ํŒŒ์ผ ๊ตฌ์กฐ
- lib - screens - home_screen.dart - profile_screen.dart - settings_screen.dart - main.dart
Dart
๋ณต์‚ฌ

main.dart

import 'package:flutter/material.dart'; import 'screens/home_screen.dart'; import 'screens/profile_screen.dart'; import 'screens/settings_screen.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { // ๋ณ€์ˆ˜ ์„ ์–ธ Widget _selectedScreen = HomeScreen(); int _selectedIndex = 0; // ํƒญ์ด ๋ˆŒ๋ ธ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜ void _onTabTapped(int index) { setState(() { _selectedIndex = index; // ์„ ํƒ๋œ ํƒญ์— ๋”ฐ๋ผ ํ™”๋ฉด ์—…๋ฐ์ดํŠธ if (_selectedIndex == 0) { _selectedScreen = HomeScreen(); } else if (_selectedIndex == 1) { _selectedScreen = ProfileScreen(); } else if (_selectedIndex == 2) { _selectedScreen = SettingsScreen(); } }); } Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: _selectedScreen, bottomNavigationBar: BottomNavigationBar( items: [ BottomNavigationBarItem( icon: Icon(Icons.home), label: 'Home', ), BottomNavigationBarItem( icon: Icon(Icons.person), label: 'Profile', ), BottomNavigationBarItem( icon: Icon(Icons.settings), label: 'Settings', ), ], currentIndex: _selectedIndex, onTap: _onTabTapped, ), ), ); } }
Dart
๋ณต์‚ฌ

home_screen.dart

import 'package:flutter/material.dart'; class HomeScreen extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Home Screen'), ), body: Center( child: Text('This is the Home Screen'), ), ); } }
Dart
๋ณต์‚ฌ

profile_screen.dart

import 'package:flutter/material.dart'; class ProfileScreen extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Profile Screen'), ), body: Center( child: Text('This is the Profile Screen'), ), ); } }
Dart
๋ณต์‚ฌ

settings_screen.dart

import 'package:flutter/material.dart'; class SettingsScreen extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Settings Screen'), ), body: Center( child: Text('This is the Settings Screen'), ), ); } }
Dart
๋ณต์‚ฌ

ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ๊ณผ ํ™”๋ฉด ์ด๋™

โ€ข
push ํ•จ์ˆ˜๋กœ ์ด๋™
โ€ข
pushNamed ํ•จ์ˆ˜๋กœ ์ด๋™

push ํ•จ์ˆ˜๋กœ ์ด๋™

๊ธฐ์กด ํ™”๋ฉด ์œ„์—, ์ง€์ •ํ•œ ํ™”๋ฉด์„ ์Šคํƒ ๊ตฌ์กฐ๋กœ ์Œ“๊ณ  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•
Navigator.of(context).push( MaterialPageRoute(builder: (context) => SecondScreen(data: "value")), ); Navigator.pop(context);
Dart
๋ณต์‚ฌ
push() ํ•จ์ˆ˜๋กœ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ, ์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•œ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” data ๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์— โ€œvalueโ€ ๋ผ๋Š” ๊ฐ’์„ ํ™”๋ฉด์„ ์ด๋™ํ•˜๋ฉด์„œ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค.

pushNamed ํ•จ์ˆ˜๋กœ ์ด๋™

๊ธฐ์กด ํ™”๋ฉด ์œ„์—, ์ง€์ •ํ•œ ํ™”๋ฉด์„ ์Šคํƒ ๊ตฌ์กฐ๋กœ ์Œ“๊ณ , ๋งคํ•‘ํ•œ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•
1.
๊ฐ’์„ ํ•˜๋‚˜ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ
2.
๊ฐ’์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ
a.
๊ฐ์ฒด๋กœ ์ „๋‹ฌ
b.
Map ์œผ๋กœ ์ „๋‹ฌ

๊ฐ’์„ ํ•˜๋‚˜ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ

โ€ข
main.dart
class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: const FirstScreen(), initialRoute: '/main', routes: { '/main' : (context) => MainScreen(), '/home' : (context) => HomeScreen(), '/user' : (context) => UserScreen(user: User(id: '', name: ''),), '/community' : (context) => CommunityScreen(), }, ); } }
Dart
๋ณต์‚ฌ
โ€ข
HomeScreen(/home) ์—์„œ CommunityScreen(/community) ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ
Navigator.pushNamed(context, "/community", arguments: 'community');
Dart
๋ณต์‚ฌ
pushNamed ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ๋Š” arguments ์†์„ฑ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
import 'package:flutter/material.dart'; class CommunityScreen extends StatelessWidget { const CommunityScreen({super.key}); Widget build(BuildContext context) { // ๋ฐ์ดํ„ฐ ์ „๋‹ฌ๋ฐ›๊ธฐ String? data = ModalRoute.of(context)!.settings.arguments as String?; return Scaffold( appBar: AppBar(title: const Text("์ปค๋ฎค๋‹ˆํ‹ฐ"),), body: Center( child: Text( "์ปค๋ฎค๋‹ˆํ‹ฐ : $data", style: TextStyle(fontSize: 30.0), ) ), bottomSheet: Container( child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ ElevatedButton( onPressed: () { // ๋ผ์šฐํŒ… ๊ฒฝ๋กœ๋กœ ํ™”๋ฉด ์ด๋™ // * arguments : ํ™”๋ฉด ์ด๋™ ์‹œ ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ ์ง€์ • // 1. ์Šคํƒ์— ์ƒˆ ํ™”๋ฉด์„ ์ถ”๊ฐ€ // Navigator.pushNamed(context, "/home", arguments: 'home'); // 2. ํ˜„์žฌ ํ™”๋ฉด ์ œ๊ฑฐ ํ›„, ์ƒˆ ํ™”๋ฉด์„ ์ถ”๊ฐ€ // Navigator.pop(context); // ํ˜„์žฌ ํ™”๋ฉด ์Šคํƒ์—์„œ ์ œ๊ฑฐ // Navigator.pushNamed(context, "/home", arguments: 'home'); // 3. ํ˜„์žฌ ํ™”๋ฉด์„ ์ƒˆ ํ™”๋ฉด์œผ๋กœ ๋Œ€์ฒด Navigator.pushReplacementNamed(context, "/home"); }, child: const Text("ํ™ˆ ํ™”๋ฉด") ), ElevatedButton( onPressed: () { Navigator.pushReplacementNamed(context, "/community", arguments: 'community'); }, child: const Text("์ปค๋ฎค๋‹ˆํ‹ฐ") ), ], ), ), ); } }
Dart
๋ณต์‚ฌ

๊ฐ’์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ „๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ

1.
๊ฐ์ฒด๋กœ ์ „๋‹ฌ
2.
Map ์œผ๋กœ ์ „๋‹ฌ

๊ฐ์ฒด๋กœ ์ „๋‹ฌ

โ€ข
HomeScreen(/home) ์—์„œ CommunityScreen(/community) ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ
โ—ฆ
๊ฐ์ฒด ์ •์˜
โ—ฆ
๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ „๋‹ฌํ•˜๋ฉด ์ด๋™
โ—ฆ
์ด๋™ํ•œ ํ™”๋ฉด์—์„œ ์ „๋‹ฌ ๋ฐ›๊ธฐ
โ€ข
๊ฐ์ฒด ์ •์˜
class Community { final int id; final String name; final String content; Community({required this.id, required this.name, required this.content}); }
Dart
๋ณต์‚ฌ
โ€ข
๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ „๋‹ฌํ•˜๋ฉด ์ด๋™
Navigator.pushNamed(context, "/community", arguments: Community( id: 1001, name : 'aloha', content : 'content' ) );
Dart
๋ณต์‚ฌ
โ€ข
์ด๋™ํ•œ ํ™”๋ฉด์—์„œ ์ „๋‹ฌ ๋ฐ›๊ธฐ
import 'package:flutter/material.dart'; class CommunityScreen extends StatelessWidget { const CommunityScreen({super.key}); Widget build(BuildContext context) { // ๋ฐ์ดํ„ฐ ์ „๋‹ฌ๋ฐ›๊ธฐ Community? community = ModalRoute.of(context)!.settings.arguments as Community?; return Scaffold( appBar: AppBar(title: const Text("์ปค๋ฎค๋‹ˆํ‹ฐ"),), body: Center( child: Text( "์ปค๋ฎค๋‹ˆํ‹ฐ : ${community.name}", style: TextStyle(fontSize: 30.0), ) ), ...
Dart
๋ณต์‚ฌ

Map ์œผ๋กœ ์ „๋‹ฌ

โ€ข
HomeScreen(/home) ์—์„œ CommunityScreen(/community) ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ
โ—ฆ
Map ์ƒ์„ฑํ•˜์—ฌ ์ „๋‹ฌํ•˜๋ฉด ์ด๋™
โ—ฆ
์ด๋™ํ•œ ํ™”๋ฉด์—์„œ ์ „๋‹ฌ ๋ฐ›๊ธฐ
โ€ข
Map ์ƒ์„ฑํ•˜์—ฌ ์ „๋‹ฌํ•˜๋ฉด ์ด๋™
Navigator.pushNamed(context, "/community", arguments: { 'id' : 1001, 'name' : 'aloha', 'content' : 'community' } );
Dart
๋ณต์‚ฌ
โ€ข
์ด๋™ํ•œ ํ™”๋ฉด์—์„œ ์ „๋‹ฌ ๋ฐ›๊ธฐ
import 'package:flutter/material.dart'; class CommunityScreen extends StatelessWidget { const CommunityScreen({super.key}); Widget build(BuildContext context) { // ๋ฐ์ดํ„ฐ ์ „๋‹ฌ๋ฐ›๊ธฐ final args = ModalRoute.of(context)!.settings.arguments as Map<String, dynamic>; return Scaffold( appBar: AppBar(title: const Text("์ปค๋ฎค๋‹ˆํ‹ฐ"),), body: Center( child: Text( "์ปค๋ฎค๋‹ˆํ‹ฐ : ${args['name']}", style: TextStyle(fontSize: 30.0), ) ), ...
Dart
๋ณต์‚ฌ

Flutter ๋„ค๋น„๊ฒŒ์ด์…˜ ์œ„์ ฏ

1. Navigator ๊ฐœ๋…

Navigator = ํ™”๋ฉด์„ Stack ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌ
โ€ข
ํ™”๋ฉด ์ด๋™ โ†’ push (์Œ“๊ธฐ)
โ€ข
๋’ค๋กœ๊ฐ€๊ธฐ โ†’ pop (๊บผ๋‚ด๊ธฐ)
[Screen A] โ†“ push [Screen B] โ†“ push [Screen C]
Plain Text
๋ณต์‚ฌ
๋’ค๋กœ๊ฐ€๊ธฐ(pop) ํ•˜๋ฉด C โ†’ B โ†’ A ์ˆœ์„œ๋กœ ๋Œ์•„๊ฐ

2. ๊ธฐ๋ณธ ํ™”๋ฉด ์ด๋™ (Navigator.push)

๋‹ค์Œ ํŽ˜์ด์ง€๋กœ ์ด๋™

Navigator.push( context, MaterialPageRoute( builder: (context) => SecondPage(), ), );
Dart
๋ณต์‚ฌ

๋ฒ„ํŠผ ์˜ˆ์ œ

ElevatedButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => SecondPage(), ), ); }, child: Text('ํŽ˜์ด์ง€ ์ด๋™'), );
Dart
๋ณต์‚ฌ

3. ๋’ค๋กœ๊ฐ€๊ธฐ (Navigator.pop)

Navigator.pop(context);
Dart
๋ณต์‚ฌ
ElevatedButton( onPressed: () { Navigator.pop(context); }, child: Text('๋’ค๋กœ๊ฐ€๊ธฐ'), );
Dart
๋ณต์‚ฌ

4. ๋ฐ์ดํ„ฐ ์ „๋‹ฌ (A โ†’ B ํ™”๋ฉด)

๊ฐ’์„ ๋ณด๋‚ด๋ฉด์„œ ์ด๋™

Navigator.push( context, MaterialPageRoute( builder: (context) => SecondPage(name: "ํ™๊ธธ๋™"), ), );
Dart
๋ณต์‚ฌ

SecondPage

class SecondPage extends StatelessWidget { final String name; SecondPage({required this.name}); Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text("Second")), body: Center( child: Text(name), ), ); } }
Dart
๋ณต์‚ฌ

5. ๋ฐ์ดํ„ฐ ์ „๋‹ฌ (B โ†’ A ํ™”๋ฉด, ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜)

SecondPage โ†’ pop ํ•˜๋ฉด์„œ ๊ฐ’ ์ „๋‹ฌ

Navigator.pop(context, "Hello");
Dart
๋ณต์‚ฌ

FirstPage์—์„œ ๊ฒฐ๊ณผ ๋ฐ›๊ธฐ

var result = await Navigator.push( context, MaterialPageRoute( builder: (context) => SecondPage(), ), ); print(result);
Dart
๋ณต์‚ฌ
โ€ป push ์•ž์— await ์ค‘์š”

6. Named Routes ๋ฐฉ์‹ (Routes)

์•ฑ์—์„œ ํฐ ํ”„๋กœ์ ํŠธ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ

main.dart

MaterialApp( initialRoute: '/', routes: { '/': (context) => HomePage(), '/second': (context) => SecondPage(), }, );
Dart
๋ณต์‚ฌ

์ด๋™

Navigator.pushNamed(context, '/second');
Dart
๋ณต์‚ฌ

๋’ค๋กœ๊ฐ€๊ธฐ

Navigator.pop(context);
Dart
๋ณต์‚ฌ

7. Named Route ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

Navigator.pushNamed( context, '/second', arguments: "ํ™๊ธธ๋™", );
Dart
๋ณต์‚ฌ

๋ฐ›๊ธฐ

var name = ModalRoute.of(context)!.settings.arguments;
Dart
๋ณต์‚ฌ

์ •๋ฆฌ (๊ฐ•์˜์šฉ ํ•ต์‹ฌ ํ‘œ)

๊ธฐ๋Šฅ
์ฝ”๋“œ
ํ™”๋ฉด ์ด๋™
Navigator.push
๋’ค๋กœ๊ฐ€๊ธฐ
Navigator.pop
Named ์ด๋™
Navigator.pushNamed
๋ฐ์ดํ„ฐ ์ „๋‹ฌ
arguments
๊ฒฐ๊ณผ ๋ฐ›๊ธฐ
await Navigator.push
Stack ๊ตฌ์กฐ
push / pop

Flutter ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

ํ™”๋ฉด ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 3๊ฐ€์ง€
1.
Navigator arguments
2.
์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
3.
์ „์—ญ ์ƒํƒœ (Singleton, Provider ๋“ฑ)
์‹ค๋ฌด์—์„œ๋Š” ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

1. Provider

๊ฐ€์žฅ ๊ธฐ๋ณธ, ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์ถ”์ฒœ
Provider

ํŠน์ง•

โ€ข
Flutter ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์†Œ๊ฐœ
โ€ข
๊ตฌ์กฐ ๋‹จ์ˆœ
โ€ข
๋ฐฐ์šฐ๊ธฐ ์‰ฌ์›€
โ€ข
์ค‘์†Œ ํ”„๋กœ์ ํŠธ ์ ํ•ฉ

์„ค์น˜

flutter pub add provider
Bash
๋ณต์‚ฌ

๊ธฐ๋ณธ ๊ตฌ์กฐ

class UserModel extends ChangeNotifier { String name = "ํ™๊ธธ๋™"; void changeName(String newName) { name = newName; notifyListeners(); } }
Dart
๋ณต์‚ฌ
ChangeNotifierProvider( create: (context) => UserModel(), child: MyApp(), );
Dart
๋ณต์‚ฌ
var user = context.watch<UserModel>(); Text(user.name);
Dart
๋ณต์‚ฌ
โ†’ ์•ฑ ์ „์ฒด์—์„œ ๋ฐ์ดํ„ฐ ๊ณต์œ  ๊ฐ€๋Šฅ

2. Riverpod

Provider์˜ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฒ„์ „
Riverpod

ํŠน์ง•

โ€ข
Provider ๋งŒ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
โ€ข
Provider๋ณด๋‹ค ์•ˆ์ „
โ€ข
BuildContext ํ•„์š” ์—†์Œ
โ€ข
ํ…Œ์ŠคํŠธ ์‰ฌ์›€
โ€ข
์ตœ๊ทผ Flutter์—์„œ ๋งŽ์ด ์‚ฌ์šฉ
flutter pub add flutter_riverpod
Bash
๋ณต์‚ฌ
final counterProvider = StateProvider((ref) => 0);
Dart
๋ณต์‚ฌ
ref.watch(counterProvider);
Dart
๋ณต์‚ฌ
์š”์ฆ˜ Flutter์—์„œ๋Š”
Provider๋ณด๋‹ค Riverpod ๋” ๋งŽ์ด ์“ฐ๋Š” ์ถ”์„ธ

3. GetX

๊ฐ€์žฅ ์‰ฌ์šด ์ƒํƒœ๊ด€๋ฆฌ + ๋„ค๋น„๊ฒŒ์ด์…˜ + DI
GetX

ํŠน์ง•

โ€ข
์ƒํƒœ๊ด€๋ฆฌ
โ€ข
๋„ค๋น„๊ฒŒ์ด์…˜
โ€ข
์˜์กด์„ฑ ์ฃผ์ž…
โ€ข
๋ผ์šฐํŒ…
โ€ข
Snackbar
โ€ข
Dialog
์ „๋ถ€ ๊ฐ€๋Šฅ
flutter pub add get
Bash
๋ณต์‚ฌ

๋ฐ์ดํ„ฐ ์ „๋‹ฌ

Get.to(SecondPage(), arguments: "ํ™๊ธธ๋™");
Dart
๋ณต์‚ฌ

๋ฐ์ดํ„ฐ ๋ฐ›๊ธฐ

var data = Get.arguments;
Dart
๋ณต์‚ฌ
Navigator ์—†์ด ํ™”๋ฉด ์ด๋™ ๊ฐ€๋Šฅ
Get.to(SecondPage()); Get.back();
Dart
๋ณต์‚ฌ
โ†’ ์•„์ฃผ ๋งŽ์ด ์‚ฌ์šฉ๋จ

์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋น„๊ต (์ค‘์š”)

๊ฐ•์˜์—์„œ ์ด ํ‘œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Œ
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
๋‚œ์ด๋„
ํŠน์ง•
Provider
์‰ฌ์›€
๊ณต์‹ ์ถ”์ฒœ
Riverpod
๋ณดํ†ต
Provider ๊ฐœ์„ ํŒ
GetX
์‰ฌ์›€
๋„ค๋น„๊ฒŒ์ด์…˜ + ์ƒํƒœ๊ด€๋ฆฌ
Bloc
์–ด๋ ค์›€
๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ
Redux
์–ด๋ ค์›€
React ์Šคํƒ€์ผ

๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ์กฐํ•ฉ (์‹ค๋ฌด)

๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์กฐํ•ฉ
์šฉ๋„
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
์ž‘์€ ์•ฑ
Provider
์ค‘ํ˜• ์•ฑ
Riverpod
๋น ๋ฅธ ๊ฐœ๋ฐœ
GetX
๋Œ€ํ˜• ์•ฑ
Bloc

๊ฐœ์ธ์ ์œผ๋กœ ์ถ”์ฒœ

Flutter ๋ฐ์ดํ„ฐ ์ „๋‹ฌ / ์ƒํƒœ๊ด€๋ฆฌ ํ•™์Šต ์ˆœ์„œ
Navigator arguments โ†’ Provider โ†’ Riverpod โ†’ GetX โ†’ Bloc
Plain Text
๋ณต์‚ฌ
์ด ์ˆœ์„œ๋กœ ๋ฐฐ์šฐ๋ฉด ์ดํ•ด ์ž˜ ๋ฉ๋‹ˆ๋‹ค.