Search

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

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

โ€ข
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
๋ณต์‚ฌ