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(); //창닫기-세밀한 제어가능 
              },
            ),
          ],
        )
    )
  ],
);