flutter
[Flutter] Dialog
킹왕짱지지
2024. 3. 18. 22:31
showDialog를 눌렀는데도 dialog가 안뜬다?
커스텀 위젯에 Material 앱을 빼고 위로 올려줘야함
오류 해결 코드
void main() {
runApp(
MaterialApp(
home: MyApp()
)
);
}
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: FloatingActionButton(
child: Text('다이얼로그'),
onPressed: (){ //버튼 눌렀을때 마다 실행
showDialog(context:context ,builder:(context){
return Dialog(child: Text('안녕'),);
});
},
),
왜 밖으로 빼면 가능해질까?
context는 족보다. 부모가 나열이되어있는거.
Widget build(BuildContext context) {
return Scaffold(
이 상황에서 Scaffold의 부모위젯은 Material App이다.
print(context.findAncestorWidgetOfExactType<MaterialApp>()); //조상중에 materialApp이 있으면 출력해주세요
Flutter에는 특별한 함수
: context(족보)를 소괄호 안에 집어넣어야 잘 작동하는 함수
showDialog()
Navigator()
Theme.of()
Scaffold.of()
따라서 MaterialApp을 main으로 뺀 이유는 return 안에 있으면 materialapp의 부모가 context로 들어가게 되어서 아무것도 없는 값이 contet가 됨.
잘못된 코드로 보면
build(context) { //여기가 context가 되는데 materialApp의 부모가 context(족보) 근데 아무것도 없음 -> 오류
return MataerialApp(
....
showDialog(context:context, builder:(context){});
MaterialApp 밖으로 빼기 싫다면 전구 누르고 Wrap with Builder 해서 context를 생성해주면 된다!
return AlertDialog(
title:Text('Contact'),
content: TextField(
onChanged: (value){
},
decoration:InputDecoration(hintText: '인풋값')
),
actions: <Widget>[
Container(
child : Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
TextButton(
child: Text('Cancel'),
onPressed: (){
Navigator.pop(context); //창닫기
},
),
TextButton(
child: Text('OK'),
onPressed: (){
Navigator.of(context).pop(); //창닫기-세밀한 제어가능
},
),
],
)
)
],
);