반응형

들어가며

Navigator 클래스란?

  • Navigator는 앱의 다양한 화면 간 전환을 관리하는데 사용되는 클래스
  • Navigator는 스택 구조로 이루어져 있으며, 각 화면은 스택에 푸시되거나 팝할 수 있다.

Navigator 함수

  • push: 새로운 화면을 스택에 푸시.
  • pop: 현재 화면을 스택에서 팝하여 이전 화면으로 복귀.
  • pushReplacement: 현재 화면을 스택에서 팝하고 새로운 화면을 푸시하여 교체.
  • popUntil: 지정된 조건을 만족할 때까지 스택에서 화면을 팝.

 

예제 - routes로 미리 지정된 경로의 화면으로 push하는 방식

main.dart

import 'package:flutter/material.dart';

import 'FirstPage.dart';
import 'SecondPage.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Navigator Example',
      initialRoute: '/first',
      routes: {
        '/first': (context) => const FirstPage(),
        '/second': (context) => const SecondPage(),
      },
    );
  }
}

FirstPage.dart

경로 : ~/lib/FirstPage.dart

import 'package:flutter/material.dart';

class FirstPage extends StatelessWidget {
  const FirstPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('First Page'),
      ),
      body: Center(
        child: ElevatedButton(
          child: const Text('Go to the Second Page'),
          onPressed: () async {
            final result =
                await Navigator.pushNamed(context, '/second', arguments: 'Hi')
                    as String?;

            debugPrint(result);
          },
        ),
      ),
    );
  }
}

SecondPage.dart

경로 : ~/lib/SecondPage.dart

import 'package:flutter/material.dart';

class SecondPage extends StatelessWidget {
  const SecondPage({super.key});

  @override
  Widget build(BuildContext context) {
    final String? message =
        ModalRoute.of(context)?.settings.arguments as String?;

    return Scaffold(
      appBar: AppBar(
        title: const Text('Second Page'),
      ),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(message ?? ''),
            ElevatedButton(
              child: const Text('Pop this page'),
              onPressed: () {
                Navigator.pop(context, 'bye');
              },
            ),
          ],
        ),
      ),
    );
  }
}

화면

Go to the Second Page 클릭시 오른쪽 화면으로 이동 Pop this page 버튼 클릭시 이전 화면으로 이동

예제 - builder로 화면 객체 생성 후 push하는 방식

main.dart

import 'package:flutter/material.dart';
import 'package:flutter_demo/FirstPage.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Navigator Example',
      home: FirstPage(),
    );
  }
}

FirstPage.dart

경로 : ~/lib/FirstPage.dart

import 'package:flutter/material.dart';

import 'SecondPage.dart';

class FirstPage extends StatelessWidget {
  const FirstPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('First Page'),
      ),
      body: Center(
        child: ElevatedButton(
          child: const Text('Go to the Second Page'),
          onPressed: () async {
            final result = await Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (_) => const SecondPage(message: 'Hi'),
                ));

            debugPrint(result);
          },
        ),
      ),
    );
  }
}

SecondPage.dart

경로 : ~/lib/SecondPage.dart

import 'package:flutter/material.dart';

class SecondPage extends StatelessWidget {
  final String message;

  const SecondPage({super.key, required this.message});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Second Page'),
      ),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(message),
            ElevatedButton(
              child: const Text('Pop this page'),
              onPressed: () {
                Navigator.pop(context, 'bye');
              },
            ),
          ],
        ),
      ),
    );
  }
}

화면

  • 위와 동일
반응형

'Development > Flutter' 카테고리의 다른 글

[Flutter] Fluttertoast  (0) 2024.02.21
[Flutter] SnackBar  (0) 2024.02.21
[Flutter] AppBar  (0) 2024.02.20
[Flutter] Image  (0) 2024.02.18
[Flutter] ListView/ListTile  (0) 2024.02.18

+ Recent posts