ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [FLUTTER] 비동기처리 (async와 await) -화면 간 데이터 전달
    Flutter 2023. 4. 7. 00:12

    [CreatePage에서 반환한 값을 HomePage에 있는 bucketList에 추가]

    • HomaPage에 추가
    onPressed: () async {
              // + 버튼 클릭시 버킷 생성 페이지로 이동
              String? job = await Navigator.push(
                context,
                MaterialPageRoute(builder: (_) => CreatePage()),
              );
              print(job);
            },

    async와 await란?

    await Navigator.push()로 화면을 띄운 뒤, 해당 화면이 종료될 때까지 71번째 라인에서 기다리도록 만들어주는 코드다.

    이후 화면이 종료되면 job이라는 변수에 반환 된 파라미터를 할당하고 다음 75번째 라인이 진행됩니다. await을 사용하려면 해당 함수에 async키워드를 넣어야 한다. (왜 넣어야하는지는 https://org9899.tistory.com/123 참고)

     

    CreatePage에 이동한 뒤 AppBar의 뒤로가기 버튼을 눌러서 HomePage로 되돌아 오는 경우 반환하는 null을 반환하기 때문에 그래서 String?로 타입을 지정

     

    - 아래 전체 코드는 Create 기능을 넣은 코드이다. 위 코드와 달라진 점은 아래와 같다.

    if (job != null) {
                // 화면 갱신 명령어 필수
                setState(() {
                  bucketList.add(job); // 버킷 리스트에 추가
                });
              }

    : 화면이 넘어갈때 데이터를 전달해주고 갱신하는 부분을 추가했다.

     

    • HomePage 전체코드
    /// 홈 페이지
    class HomePage extends StatefulWidget {
      const HomePage({Key? key}) : super(key: key);
    
      @override
      State<HomePage> createState() => _HomePageState();
    }
    
    // 상태 클래스
    class _HomePageState extends State<HomePage> {
      List<String> bucketList = ['여행가기']; // 전체 버킷리스트 목록
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("버킷 리스트"),
          ),
          body: bucketList.isEmpty
              ? Center(child: Text("버킷 리스트를 작성해 주세요."))
              : ListView.builder(
                  itemCount: bucketList.length, // bucketList 개수 만큼 보여주기
                  itemBuilder: (context, index) {
                    String bucket = bucketList[index]; // index에 해당하는 bucket 가져오기
                    return ListTile(
                      // 버킷 리스트 할 일
                      title: Text(
                        bucket,
                        style: TextStyle(
                          fontSize: 24,
                        ),
                      ),
                      // 삭제 아이콘 버튼
                      trailing: IconButton(
                        icon: Icon(CupertinoIcons.delete),
                        onPressed: () {
                          // 삭제 버튼 클릭시
                          print('$bucket : 삭제하기');
                        },
                      ),
                      onTap: () {
                        // 아이템 클릭시
                        print('$bucket : 클릭 됨');
                      },
                    );
                  },
                ),
          floatingActionButton: FloatingActionButton(
            child: Icon(Icons.add),
            onPressed: () async {
              // + 버튼 클릭시 버킷 생성 페이지로 이동
              String? job = await Navigator.push(
                context,
                MaterialPageRoute(builder: (_) => CreatePage()),
              );
              // print(job);
              if (job != null) {
                // 화면 갱신 명령어 필수
                setState(() {
                  bucketList.add(job); // 버킷 리스트에 추가
                });
              }
            },
          ),
        );
      }
    }
    • CreatePage 전체코드
    /// 버킷 생성 페이지
    class CreatePage extends StatefulWidget {
      const CreatePage({Key? key}) : super(key: key);
    
      @override
      State<CreatePage> createState() => _CreatePageState();
    }
    
    class _CreatePageState extends State<CreatePage> {
      // TextField의 값을 가져올 때 사용합니다.
      TextEditingController textController = TextEditingController();
    
      // 경고 메세지
      String? error;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("버킷리스트 작성"),
            // 뒤로가기 버튼
            leading: IconButton(
              icon: Icon(CupertinoIcons.chevron_back),
              onPressed: () {
                Navigator.pop(context);
              },
            ),
          ),
          body: Padding(
            padding: const EdgeInsets.all(16),
            child: Column(
              children: [
                // 텍스트 입력창
                TextField(
                  controller:
                      textController, // TextField와 TextEditingController를 연결해 줍니다.
                  autofocus: true,
                  decoration: InputDecoration(
                    hintText: "하고 싶은 일을 입력하세요",
                    errorText: error,
                  ),
                ),
                SizedBox(height: 32),
                // 추가하기 버튼
                SizedBox(
                  width: double.infinity,
                  height: 48,
                  child: ElevatedButton(
                    child: Text(
                      "추가하기",
                      style: TextStyle(
                        fontSize: 18,
                      ),
                    ),
                    onPressed: () {
                      // 추가하기 버튼 클릭시
                      String job =
                          textController.text; // textController로부터 현재 입력되어있는 값을 가져옴
                      // print(job);
                      if (job.isEmpty) {
                        setState(() {
                          // error 변수의 값이 바뀌는 경우 화면을 갱신
                          error = "내용을 입력해주세요."; // 내용이 없는 경우 에러 메세지
                        });
                      } else {
                        setState(() {
                          error = null; // 내용이 있는 경우 에러 메세지 숨기기
                        });
                        // 뒤쪽 화면으로 넘기고 싶은 변수를 두번째 파라미터에 넣어주면 됨.
                        Navigator.pop(context, job); // job 변수를 반환하며 화면을 종료
                      }
                    },
                  ),
                ),
              ],
            ),
          ),
        );
      }
    }
    • 결과화면

     

     

Designed by Tistory.