반응형
[WillPopScope]
App 개발을 하다보면 취소키를 막고 싶은 경우가 있을 것이다.
이럴 때, WillPopScope를 사용하면 취소키를 눌러도 뒤로 가지 않는다.
사용 방법은 간단하다. Scaffold를 WillPopScope로 감싸주면 된다.
import 'package:flutter/material.dart';
void main() => runApp(
MaterialApp(
title: 'MyApp',
home: MyApp(),
),
);
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(
appBar: AppBar(
title: Text('Welcome to Flutter'),
),
body: Center(
child: Text('Hello World'),
),
),
onWillPop: () {},
);
}
}
*onWillPop: null 이라 하면 WillPopScope가 동작하지 않는다.
또한 onWillPop을 통해 취소 버튼 눌렀을 경우 액션을 정할 수 있다.
import 'package:flutter/material.dart';
void main() => runApp(
MaterialApp(
title: 'MyApp',
home: MyApp(),
),
);
class MyApp extends StatefulWidget {
@override
_MyApp createState() => _MyApp();
}
class _MyApp extends State<MyApp> {
String _text = "Hello World"; // 초기값
@override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(
appBar: AppBar(
title: Text('Welcome to Flutter'),
),
body: Center(
child: Text(_text),
),
),
onWillPop: () {
setState(() {
_text = "Dont Touch Back Button";
});
},
);
}
}
물론 setState()를 사용하려면 StateFulWidget으로 만들어야 한다.
StatefulWidget과 StatelessWidget을 모른다면 아래의 포스팅을 참고하자.
[Flutter] StatelessWidget & StatefulWidget 차이점 정리
하지만 WillPopScope를 Navigator Push 상태에서 사용한다면 AppBar의 뒤로 가기 버튼도 안된다..
import 'package:flutter/material.dart';
void main() => runApp(
MaterialApp(
title: 'MyApp',
home: MyApp(),
),
);
class MyApp extends StatefulWidget {
@override
_MyApp createState() => _MyApp();
}
class _MyApp extends State<MyApp> {
@override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(
appBar: AppBar(
title: Text('Welcome to Flutter'),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.push(context,
MaterialPageRoute(builder: (context) => SecondScreen()));
},
child: Text("Go to SecondScreen"),
),
),
),
onWillPop: () {},
);
}
}
class SecondScreen extends StatefulWidget {
@override
_SecondScreen createState() => _SecondScreen();
}
class _SecondScreen extends State<SecondScreen> {
String _text = "Second Screen !";
@override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(
appBar: AppBar(title: Text('SecondScreen')),
body: Center(
child: Text(_text),
),
),
onWillPop: () {
setState(() {
_text = "Dont leave Me..";
});
},
);
}
}
Navigator가 궁금하다면 아래의 포스팅을 참고하자 !
[Flutter] Navigator & Named Route "화면 전환의 시작"
이 문제를 해결하는 방법은 AppBar의 뒤로가기 버튼을 새롭게 만드는 방법이다.
AppBar의 구조를 모른다면 아래의 포스팅을 참고하자..
[Flutter] AppBar?! AppBar의 "모든 것"
import 'package:flutter/material.dart';
void main() => runApp(
MaterialApp(
title: 'MyApp',
home: MyApp(),
),
);
class MyApp extends StatefulWidget {
@override
_MyApp createState() => _MyApp();
}
class _MyApp extends State<MyApp> {
@override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(
appBar: AppBar(
title: Text('Welcome to Flutter'),
),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.push(context,
MaterialPageRoute(builder: (context) => SecondScreen()));
},
child: Text("Go to SecondScreen"),
),
),
),
onWillPop: () {},
);
}
}
class SecondScreen extends StatefulWidget {
@override
_SecondScreen createState() => _SecondScreen();
}
class _SecondScreen extends State<SecondScreen> {
String _text = "Second Screen !";
@override
Widget build(BuildContext context) {
return WillPopScope(
child: Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back_ios),
onPressed: () {
Navigator.pop(context);
},
),
title: Text('SecondScreen')),
body: Center(
child: Text(_text),
),
),
onWillPop: () {
setState(() {
_text = "Dont leave Me..";
});
},
);
}
}
Icon 모양을 arrow_back_ios로 하면 기존 AppBar의 뒤로가기 버튼과 비슷하게 꾸밀 수 있다.
반응형
댓글