-
[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 변수를 반환하며 화면을 종료 } }, ), ), ], ), ), ); } }
- 결과화면
'Flutter' 카테고리의 다른 글
[FLUTTER] 상태 관리 패키지 (Provider) 준비하기 (0) 2023.04.07 [FLUTTER] 리펙토리(Refactory) (0) 2023.04.07 [FLUTTER] shared_preferences 패키지 사용해보기 (앱 자체 데이터 저장소) (0) 2023.04.06 [FLUTTER] 화면전환 (Navigator) (0) 2023.03.23 [FLUTTER] Stack (0) 2023.03.23