안녕하세요 독학코딩입니다. 오늘은 Flutter에서 ScaffoldMessenger
에 대해서 배워보겠습니다. ScaffoldMessenger
는 Scaffold
에서 사용자에게 손 쉽게 알림 들을 띄울 수 있는 위젯입니다. 앱을 개발하다 보면 사용에게 작은 안내를 보내야 할 많은데, Scaffold
를 사용하는건 일반적이니 ScaffoldMessenger
를 이용하면 알림을 아주 쉽게 띄울 수 있습니다.
ScaffoldMessenger
는 Scaffold
하위 트리의 루트에 알림을 표시합니다. 만약 내부의 중첩된 Scaffold
에 대한 알림을 표시하려면 중첩 수준 사이에 새 ScaffoldMessenger
를 인스턴스화하여 새 범위를 설정해야 합니다..
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const Scaffold(
body: FirstRoute(),
),
);
}
}
일단 위 처럼 main.dart
를 생성하겠습니다. 이전 포스트와 차이를 말하자면 MaterialApp
의 home을 바로 FirstRoute
로 설정하는 것이 아니라 Scaffold
를 한 번 거친다는 것입니다. 그래야 ScaffoldMessenger
를 사용할 수 있습니다.
Flutter ScaffoldMessenger SnackBar 띄우기
class FirstRoute extends StatelessWidget {
const FirstRoute({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('First Route'),
),
body: Center(
child: ElevatedButton(
child: const Text("스낵바 버튼"),
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('이것은 스낵바 입니다. 두 번째 페이지로 이동 합니다.'),
),
);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const SecondRoute()),
);
},
),
),
);
}
}
FirstRoute
은 위와 같습니다. Scaffold
의 루트로 있는 위젯이지 ScaffoldMessenger
를 사용할 수 있습니다. ScaffoldMessenger
를 사용하는 방법은 아주 간단합니다.
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: MYWIDGET()))
위와 같이 작성하고 MYWIDGET() 부분에 스낵바에 표시할 텍스트를 설정해주시면 됩니다.
Flutter ScaffoldMessenger Banner 띄우기
class SecondRoute extends StatelessWidget {
const SecondRoute({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Second Route'),
),
body: Center(
child: ElevatedButton(
child: const Text("배너 버튼"),
onPressed: () {
ScaffoldMessenger.of(context).showMaterialBanner(
const MaterialBanner(
content: Text('이것은 배너 입니다. 첫 번째 페이지로 이동 합니다.'),
actions: [
TextButton(
onPressed: null,
child: Text('확인'),
),
],
),
);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const FirstRoute()),
);
},
),
),
);
}
}
SecondRoute
은 위와 같습니다. 배너를 띄우는 건 스낵바와 크게 다르지 않습니다. showSnackBar
를 showMaterialBanner
로 바꾸시고 안에 SnackBar
도 MaterialBanner
로 바꾸시기만 하면 됩니다.
ScaffoldMessenger.of(context).showMaterialBanner(
const MaterialBanner(
content: Text('이것은 배너 입니다. 첫 번째 페이지로 이동 합니다.'),
actions: [
TextButton(
onPressed: null,
child: Text('확인'),
),
],
),
);
배너와 스낵바의 차이는 직접 확인해보시면 될 것 같습니다. 전체 코드는 아래에 담아두겠습니다.
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const Scaffold(
body: FirstRoute(),
),
);
}
}
class FirstRoute extends StatelessWidget {
const FirstRoute({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('First Route'),
),
body: Center(
child: ElevatedButton(
child: const Text("스낵바 버튼"),
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('이것은 스낵바 입니다. 두 번째 페이지로 이동 합니다.'),
),
);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const SecondRoute()),
);
},
),
),
);
}
}
class SecondRoute extends StatelessWidget {
const SecondRoute({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Second Route'),
),
body: Center(
child: ElevatedButton(
child: const Text("배너 버튼"),
onPressed: () {
ScaffoldMessenger.of(context).showMaterialBanner(
const MaterialBanner(
content: Text('이것은 배너 입니다. 첫 번째 페이지로 이동 합니다.'),
actions: [
TextButton(
onPressed: null,
child: Text('확인'),
),
],
),
);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const FirstRoute()),
);
},
),
),
);
}
}
'Flutter > Flutter 위젯' 카테고리의 다른 글
Flutter - Theme, ThemeData, 테마 바꾸기 (0) | 2022.04.19 |
---|---|
Flutter - RefreshIndicator, Pull to Refresh, 당겨서 새로고침 (0) | 2022.04.16 |
Flutter - Inkwell, GestureDetector, 터치 클릭 인식 (0) | 2022.04.12 |
Flutter - AbsorbPointer, 클릭 터치 방지 (0) | 2022.04.09 |
Flutter DropdownButton 다루기 (0) | 2022.04.05 |
댓글