이번 시간에는 버튼을 학습했다.
단순한 버튼은 아니고 클릭하면 메시지가 뜨게 하는 버튼이다.
Material은 기본적으로 snackbar를 제공하여 메시지를 띄울수있지만 안이쁘다...
난 이쁜걸 원한다...
바로 Toast라는 것이다.
먼저 설치 방법부터 알아보자
1. pubspec.yaml 수정
프로젝트 파일중 pubspec.yaml에 들어가
fluttertoast: ^8.0.9를 넣어준다.
그 다음 위쪽 Pub get을 눌러 load 해준다.
2, main.dart 수정
import 'package:fluttertoast/fluttertoast.dart';
맨 윗줄에 해당 문구 삽입
이렇게 진행 하면 사용준비는 완료이다.
이번 시간에 만들 예제이다.
appbar - 버튼 3개 텍스트 1개
body - 텍스트 1개 버튼2개
로 구성되어있다.
appbar에 있는 버튼은 Toast 기본 설정으로 띄울것이며
body에 있는 Custom Button은 Toast-Custom을 이용
Success Button는 motion-toast를 사용할것이다.
*motion-toast는 별도의 설정이 필요하다... 검색 ㄱㄱ
appBar: AppBar(
title: Center(child: Text("appBar & Toast Test")),
elevation: 0.0,
leading: IconButton(
icon: Icon(Icons.menu),
onPressed: () {
showToast('이것은 메뉴입니다.');
}),
actions: [
IconButton(
icon: Icon(Icons.shopping_cart),
onPressed: () {
showToast('이것은 장바구니입니다.');
},
),
IconButton(
icon: Icon(Icons.search_rounded),
onPressed: () {
showToast('이것은 검색입니다.');
},
),
],
),
leading - appbar 맨 왼쪽에 자리잡는 위젯이다.
action - appbar 맨 오른쪽에 자리잡는 위젯이다.
body: Container(
height: double.infinity,
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Text("Toast 메시지 예제", style: TextStyle(fontSize: 20,),
),
const SizedBox(height: 10,),
Container(width: 200, height: 50,
child: ElevatedButton(
onPressed: () {_showToast();},
child: const Text("Custom Button", style: TextStyle(fontSize: 20,),),
),
),
const SizedBox(height: 10,),
Container(width: 200, height: 50,
child: ElevatedButton(
onPressed: () {_displaySuccessToast(context);},
child: const Text("Success Toast", style: TextStyle(fontSize: 20,),),
),
),
height: double.infinity,
width: double.infinity,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
이 두가지는 항상 쓰려고한다. 왜냐하면 위젯들이 센터로 자리잡을 수 있게 한다.
중간중간 SizeBox를 통해 위젯마다 공간을 주었다.
이제 Toast 부분을 살펴보자
void showToast(String msg2) {
Fluttertoast.showToast(
msg: msg2,
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.red,
textColor: Colors.white,
);
}
onPressed: () {
showToast('이것은 장바구니입니다.');
},
이것은 appbar에 들어간 Toast 기본 버튼이다.
Fluttertoast.showToast를 이용하면 쉽게 구현가능하다.
두번째 코드는 호출 코드이다.
코드와 같이 String을 넣어줄수있다.
late FToast fToast;
@override
void initState() {
super.initState();
fToast = FToast();
fToast.init(context);
}
_showToast() {
Widget toast = Container(
padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25.0),
color: Colors.redAccent,
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: const [
Icon(Icons.check, color: Colors.white,),
SizedBox(
width: 10.0,
),
Text('이것은 커스텀 버튼입니다.', style: TextStyle(color: Colors.white,),),
],
),
);
fToast.showToast(
child: toast,
gravity: ToastGravity.BOTTOM,
toastDuration: Duration(seconds: 1),
);
}
onPressed: () {
_showToast();
},
Toast를 커스텀 할 수 있는 코드이다.
기본으로 해도 충분히 깔끔하게 나오지만 좀 더 아쉬우면 해당 기능으로 구현해보자.
여럿 값을 만져주면서 어떤 부분이 어떻게 변경되는지 쉽게 확인가능하다.
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:motion_toast/motion_toast.dart';
void main() {
runApp(const appBar());
}
class appBar extends StatelessWidget {
const appBar({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'appBar & Toast',
theme: ThemeData(primarySwatch: Colors.lightGreen),
home: firstpage(),
);
}
}
class firstpage extends StatefulWidget {
const firstpage({Key? key}) : super(key: key);
@override
State<firstpage> createState() => _firstpageState();
}
class _firstpageState extends State<firstpage> {
late FToast fToast;
@override
void initState() {
super.initState();
fToast = FToast();
fToast.init(context);
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFF69abce),
appBar: AppBar(
title: Center(child: Text("appBar & Toast Test")),
elevation: 0.0,
leading: IconButton(
icon: Icon(Icons.menu),
onPressed: () {
showToast('이것은 메뉴입니다.');
}),
actions: [
IconButton(
icon: Icon(Icons.shopping_cart),
onPressed: () {
showToast('이것은 장바구니입니다.');
},
),
IconButton(
icon: Icon(Icons.search_rounded),
onPressed: () {
showToast('이것은 검색입니다.');
},
),
],
),
body: Container(
height: double.infinity,
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Text("Toast 메시지 예제", style: TextStyle(fontSize: 20,),
),
const SizedBox(height: 10,),
Container(width: 200, height: 50,
child: ElevatedButton(
onPressed: () {_showToast();},
child: const Text("Custom Button", style: TextStyle(fontSize: 20,),),
),
),
const SizedBox(height: 10,),
Container(width: 200, height: 50,
child: ElevatedButton(
onPressed: () {_displaySuccessToast(context);},
child: const Text("Success Toast", style: TextStyle(fontSize: 20,),),
),
),
],
),
));
}
void showToast(String msg2) {
Fluttertoast.showToast(
msg: msg2,
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.red,
textColor: Colors.white,
);
}
void _displaySuccessToast(context) {
MotionToast.success(
title: Text("Success"),
description: Text("This is Success Toast"),
).show(context);
}
_showToast() {
Widget toast = Container(
padding: const EdgeInsets.symmetric(horizontal: 15.0, vertical: 10.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25.0),
color: Colors.redAccent,
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: const [
Icon(Icons.check, color: Colors.white,),
SizedBox(
width: 10.0,
),
Text('이것은 커스텀 버튼입니다.', style: TextStyle(color: Colors.white,),),
],
),
);
fToast.showToast(
child: toast,
gravity: ToastGravity.BOTTOM,
toastDuration: Duration(seconds: 1),
);
}
}