Notice
Recent Posts
Recent Comments
Link
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

[flutter] 18(26)๊ฐ• | ํ”Œ๋Ÿฌํ„ฐ 2.0 SnackBar ์™€ ScaffoldMessenger ๋ณธ๋ฌธ

flutter/์ˆœํ•œ๋ง›(๊ธฐ์ดˆ)

[flutter] 18(26)๊ฐ• | ํ”Œ๋Ÿฌํ„ฐ 2.0 SnackBar ์™€ ScaffoldMessenger

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2021. 8. 12. 02:56

โœ… ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ํ”Œ๋Ÿฌํ„ฐ 2.0์œผ๋กœ ์ธํ•ด์„œ SnackBar์˜ ์‚ฌ์šฉ์ด ์™„์ „ํžˆ ๋‹ฌ๋ผ์กŒ์–ด.

๊ทธ๋ž˜์„œ 18๊ฐ•์ด ์•ˆ๋˜์„œ 26๊ฐ•์œผ๋กœ ํŒจ์น˜๊ฐ•์ขŒ๋ฅผ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ ์—ฌ๊ธฐ๋กœ ๋ณด๊ธฐ!

ํ˜น์‹œ๋ผ๋„ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ๋”ฐ๋ผํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด ์ด ์‹œ์ ์—์„œ ํŒจ์น˜๊ฐ•์ขŒ์ชฝ์œผ๋กœ ๊ฑด๋„ˆ ๋›ฐ๋Š”๊ฒƒ์„ ์ถ”์ฒœํ•ด.

๋˜ํ•œ ์ด๋ฒˆ ๊ฐ•์˜๋Š” ์ƒ๋‹นํžˆ ๋ณต์žกํ•œ ๊ฐœ๋…๋“ค๊ณผ ์•ฑ ๊ฐœ๋ฐœ์— ์žˆ์–ด์„œ ์ƒ๋‹นํžˆ ์ค‘์š”ํ•œ ๊ฒƒ๋“ค์ด ๋งŽ์œผ๋ฏ€๋กœ ์ง‘์ค‘ ๊ทธ๋ฆฌ๊ณ  ๋˜ ์ง‘์ค‘ํ•  ๊ฒƒ!

๊ทธ๋ฆฌ๊ณ  ํ”Œ๋Ÿฌํ„ฐ ํ•˜๋ฉด์ „ํ™˜์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋“ค์„ ์—ฟ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ˜ƒ ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ๊ธธ์–ด์„œ ๋‹ค์Œ ํฌ์ŠคํŒ…๊นŒ์ง€ ์ด์–ด์ง‘๋‹ˆ๋‹ค...~~

 

1. ScaffoldMessenger class

2. Buttons(TextButton, ElevatedButton, OutlinedButton)

3. Global Key

 

 

โœ… Why ScaffoldMessger?

์šฐ์„  Scaffold.of(context)๋ฅผ ์‚ดํŽด๋ณด์ž 

Scaffold์— ๋Œ€ํ•œ ์„ค๋ช…

๊ธฐ๋ณธ์ ์œผ๋กœ Scaffold.of(context)์˜ ๊ฒฝ์šฐ์—๋Š” ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด Scaffold๋ฅผ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•˜๋ผ๋Š” ์˜๋ฏธ์˜€๋‹ค.

๊ทธ.๋Ÿฐ.๋ฐ ์ด ๊ณผ์ •์—์„œ Scaffold.of ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ˜„์žฌ์˜ ์ปจํ…์ŠคํŠธ๋กœ๋Š” Scaffold๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๋‹ค.

 

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ Builder์œ„์ ฏ์„ ์ƒ์„ฑํ•ด์„œ ์ƒˆ๋กœ์šด context๋ฅผ Scffold.of ๋ฉ”์†Œ๋“œ๊ฐ€ ์ „๋‹ฌ๋ฐ›๊ฒŒ ํ•œ ํ›„ ๊ทธ ์œ„์น˜์—์„œ ๋ถ€ํ„ฐ ์œ„์ ฏ ํŠธ๋ฆฌ ์ƒ์— Builder ์œ„์— ์œ„์น˜ํ•˜๊ณ  ์žˆ๋Š” Scaffold ์œ„์ ฏ์„ ์ฐพ์•„๋‚˜์„œ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์—ˆ๋‹ค.

์•„๋ž˜์˜ ๊ทธ๋ฆผ์€ ๋ฌธ์ œํ•ด๊ฒฐ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์œ„์˜ ๊ธ€์— ๋Œ€ํ•œ ์„ค๋ช…์ด๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ด๋ฏธ์ง€

๊ทธ๋Ÿผ ๊ธฐ์กด์˜ ์Šค๋‚ต๋ฐ”๋Š” ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ๊ฐ€์กŒ์„๊นŒ?

๊ธฐ์กด SnackBar์˜ ๋ฌธ์ œ์ 

๋ฐ”๋กœ ํ˜„์žฌ context๋Š” ํ˜„์žฌ์˜ ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ์— ํ™”๋ฉด์„ ๋ฐ”๊พธ๊ฒŒ ๋˜๋ฉด ์ƒˆ๋กœ์šด context๊ฐ€ ์ƒ๊ฒจ์„œ ๊ธฐ์กด SnackBar๊ฐ€ context๋ฅผ ์ฐพ์ง€ ๋ชปํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๊ทธ๋Ÿผ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ???

ํ”Œ๋Ÿฌํ„ฐ 2.0์—์„œ ๋ฐ”๋€ ๋กœ์ง

ScaffoldMessenger๋ฅผ ์ตœ์ƒ๋‹จ์— ๋‘๊ณ  ๊ฐ๊ฐ์˜ SnackBar์—์„œ ์ž์† Scaffold๋“ค์„ ์ฐธ์กฐํ•˜๊ฒŒ ํ•œ๋‹ค.

 

 

โœ… ์ฝ”๋“œ๋ฆฌ๋ทฐ ๋ฐ ์ฝ”๋“œ์˜ ์ดํ•ด

import 'package:flutter/material.dart'; // ๋ฐ์Šคํฌํƒ‘, ์•ฑ ๋“ฑ์— ๊ณ ๋ฃจ UI๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ตฌ๊ธ€์ด ์ œ๊ณตํ•ด์ฃผ๋Š” ํŒจํ‚ค

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      // ์‹ค์งˆ์ ์œผ๋กœ ๋ชจ๋“  ์•ฑ์„ ๊ฐ์‹ธ๊ณ  ์žˆ๋‹ค.
      title: 'Appbar', // ์•ฑ์„ ์ด์นญํ•˜๋Š” ์ด๋ฆ„ -> ์Šค๋งˆํŠธ ํฐ ์•ฑ์—์„œ ์ตœ๊ทผ ์‚ฌ์šฉํ•œ ์•ฑ ๋ณด์—ฌ์ค„ ๋•Œ์˜ ์ด๋ฆ„
      theme: ThemeData(primarySwatch: Colors.red // ํŠน์ •์ƒ‰์˜ ์‘์šฉ๋“ค์„ ๊ธฐ๋ณธ ์ƒ‰์ƒ์œผ๋กœ ์ง€์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒ 
          ),
      home: MyPage(), // home์€ ์•ฑ์ด ์‹คํ–‰๋  ๋•Œ ๊ฐ€์žฅ๋จผ์ € ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด
    );
  }
}

class MyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Snack Bar'),
      ),
      body: HomeBody(), // ๋ฐ”๋”” ๋ถ€๋ถ„์— ํ™ˆ ๋ฐ”๋””๋ฅผ ๋‘”๋‹ค.
      floatingActionButton: FloatingActionButton( // ํ”Œ๋กœํŒ… ๋ฒ„ํŠผ๋„ ๋ฐฐ์น˜
        child: Icon(Icons.thumb_up),
        onPressed: () {
          ScaffoldMessenger.of(context).showSnackBar( // ์Šค์บํด๋“œ๋ฉ”์‹ ์ € ๋งŒ๋“ค๊ธฐ
            // ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์Šค์บํด๋“œ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•ด
            SnackBar( // ์Šค๋‚ต๋ฐ”
              content: Text('Like a new Snack Bar!'), // ๋‚ด
              duration: Duration(seconds: 5),
              action: SnackBarAction( // ์Šค๋‚ต๋ฐ” ์•ก์…˜ - ์šฐ์ธก์— ๋‹ฌ๋ฆฌ๋Š” ์•„์ดํ…œ ๋ฒ„ํŠผ!
                label: 'Undo',
                onPressed: () {
                  Navigator.push(context, // ๋„ค๋น„๊ฒŒ์ด์…˜ ํ˜•์‹์œผ๋กœ pushํ˜•์‹์œผ๋กœ ์ „ํ™˜
                      MaterialPageRoute(builder: (context) => ThirdPage())); // ํ™”๋ฉด์ „ํ™˜ ์ฝ”๋“œ
                },
              ),
            ),
          );
        },
      ),
    );
  }
}

class HomeBody extends StatelessWidget {
  const HomeBody({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center( // ์„ผํ„ฐ์ž„!! ์ฃผ
      child: ElevatedButton( // ์—˜๋ ˆ๋ฒ ์ดํ‹ฐ๋“œ ๋ฒ„ํŠผ
        child: Text('Go to the second page'),
        onPressed: () {
          Navigator.push(
              context, MaterialPageRoute(builder: (context) => SecondPage())); // ๋‘๋ฒˆ์จฐ ํŽ˜์ด์ง€๋กœ ์ „ํ™˜
        },
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  const SecondPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Page'),
      ),
      body: Center(
        child: Text(
          '"์ข‹์•„์š”๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค."',
          style: TextStyle(fontSize: 20.0, color: Colors.redAccent),
        ),
      ),
    );
  }
}

class ThirdPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ScaffoldMessenger(
      child: Scaffold(
        appBar: AppBar(
          title: Text('Third Page'),
        ),
        body: Builder( // ๋นŒ๋”๋ฅผ ํ†ตํ•ด์„œ context๋ฅผ ๋ฐ›์•„์•ผ ํ•ด.
          builder: (context){
          return Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text(
                  '"์ข‹์•„์š”๋ฅผ ์ทจ์†Œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"',
                  style: TextStyle(fontSize: 20.0, color: Colors.redAccent),
                ),
                ElevatedButton(
                  onPressed: () {
                    ScaffoldMessenger.of(context).showSnackBar(SnackBar( // ์Šค์บํด๋“œ ๋ฉ”์‹ ์ €๊ฐ€ ์Šค๋‚ต๋ฐ” ๋“ค๊ณ  ์žˆ์Œ!!
                      // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ™”๋ฉด์„ ๋น ์ ธ๋‚˜๊ฐ€์„œ context๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ์Šค๋‚ต๋ฐ”๊ฐ€ ์‚ฌ๋ผ์ ธ์„œ UI๊ฐœ์„ 
                      content: Text("์ข‹์•„์š”๊ฐ€ ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค"),
                      duration: Duration(seconds: 3),
                    ));
                  },
                  child: Text('์ทจ์†Œํ•˜๊ธฐ'),
                ),
              ],
            ),
          );}

        ),
      ),
    );
  }
}

์ฃผ์˜๊นŠ๊ฒŒ ๋ด์•ผํ•  ์ ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐ„๋‹จํžˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€์ž.

โœ… body ๋ถ€๋ถ„์— HomeBody๋ฅผ ๋‘์–ด ๋”ฐ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค๋Š” ์ . 

๋‚ด๊ฐ€ ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ๋ฐฐ์šฐ๋ฉด์„œ ์œ„์ ฏ์ด๋ผ ๊ฐ„ํŽธํ•˜๋‹ค๋Š” ์ƒ๊ฐ์€ ๋“œ๋Š”๋ฐ ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์ง€๊ณ  ๊ธธ์–ด์งˆ์ˆ˜๋ก ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ํž˜๋“ค ๊ฑฐ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋Š”๋ฐ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ทธ๋‚˜๋งˆ ๋‹คํ–‰.. ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ๋Š์ž„์—†์ด ๊ณต๋ถ€ํ•ด์•ผ๊ฒ ๋‹ค!

 

โœ… ๋‹ค์Œ์€ ๋ฒ„ํŠผ๋“ค์ธ๋ฐ, ์ด๊ฑด ๋ญ ๊ทธ๋ƒฅ ๋ณด๋‹ค๋ณด๋ฉด ๋ˆˆ์— ์ต์œผ๋‹ˆ๊นŒ!! 

 

โœ… ThirdPage์ชฝ์—์„œ return ScaffoldMessenger๋กœ ๊ฐ์‹ผ ํ›„์— child๋กœ Scaffold๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , ๊ฑฐ๊ธฐ์— builder๋ฅผ ๋ถ™์ธ ํ›„์— builder ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด์„œ context๋ฅผ ์ฃผ์–ด์„œ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ผ๋Š” ์ ์ด๋‹ค.

 

์ด๊ฒƒ์ด ์™œ ๋Œ€๋‹จํ•˜๋ƒ๋ฉด, ScaffoldMessenger๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ๋‚œ ํ›„์— 3์ดˆ ๋™์•ˆ ์ง€์†ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์œ ์ €๋ผ backButton์„ ํ†ตํ•ด์„œ ํ™”๋ฉด์„ ๋‚˜๊ฐ€๋ฒ„๋ฆฌ๋ฉด? ๊ทธ๋Ÿฌ๋ฉด ๊ธฐ์กด์—๋Š” SnackBar๊ฐ€ ๋‚จ์•„์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ํ™”๋ฉด์„ ๋‚˜๊ฐ€๋Š” ์ฆ‰์‹œ ์Šค๋‚ต๋ฐ”๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

์™œ ๊ทธ๋Ÿด๊นŒ? builder๋กœ ์ค€ context๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ํ™”๋ฉด์ด ๋‚˜๊ฐ€๋ฉด builder๊ฐ€ ์‚ฌ๋ผ์ ธ์„œ Scaffold๋ฅผ ๋†”์ฃผ๊ฒŒ ๋˜๋ฏ€๋กœ ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

์‰ฝ๊ฒŒ ๋น„๊ตํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š”๊ฒƒ์ด ์ฒซ ํŽ˜์ด์ง€์—์„œ๋Š” ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์šด๋ฐ ์—˜๋ฆฌ๋ฒ ์ดํ‹ฐ๋“œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์Šค๋‚ต๋ฐ”๊ฐ€ ๋‚จ์•„์žˆ๋Š”๋ฐ, ํ™•์‹คํžˆ ์ฐจ์ด๋ฅผ ๋Š๋‚„ ์ˆ˜ ์žˆ๋‹ค.

 

 

์•„๋ž˜ ์‚ฌ์ง„์„ ๋ณด์ž.

 

โœ… Second Page๋กœ ์ด๋™ํ•ด๋„ ์Šค๋‚ต๋ฐ” ๋‚จ์•„์žˆ์Œ

ํ™”๋ฉด ์ด๋™ํ›„์—๋„ ๊ณ„์† ์Šค๋‚ต๋ฐ”๊ฐ€ ๋‚จ์•„์žˆ๋‹ค.

 

โœ… ThirdPage๋ฅผ ๋ณด์ž. ์Šค๋‚ต๋ฐ” ์ฆ‰์‹œ ์‚ฌ๋ผ์ง

ํ™”๋ฉด ์ „ํ™˜ ํ›„ ์ฆ‰์‹œ ์Šค๋‚ต๋ฐ”๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

 

 

์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ๊ฒ ๋Š”๊ฐ€?

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋…ผ๋ฆฌ์ ์œผ๋กœ ์™„๋ฒฝํžˆ ์ดํ•ดํ–ˆ์Œ์„ ํ•œ๋ฒˆ ๋” ์ •๋ฆฌํ•ด๋ณด์ž

๋‚˜์˜ ์ดํ•ด

๋‚ด๊ฐ€ ํ‹€๋ฆฐ์ ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์–ด์„œ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”~! 

Comments