Flutter 비동기 프로그래밍

Hyunsoo Jung·2024년 11월 6일
0

Flutter

목록 보기
15/15

Future, async, await

  • 14.1 Future의 개념
  • 14.2 비동기 방식
  • 14.3 이벤트 루프
  • 14.4 asyncawit 키워드
  • 14.5 try / catch 블록
  • 14.6 앱에서 Future 출력하기
  • 14.7 streamstreamBuilder

14.1 Future의 개념

Future

  • 곧 String, int, double과 같은 실질적인 데이터가 반활될 것이라는 약속
    Future<String>//곧 String 받음
    Future<int>//곧 int 받음
    Future<double>//곧 double 받음
  • 데이터가 성공적으로 받았을때는 데이터 반환, 실패시 에러 반환

14.2 비동기 방식

동기(Synchronous) 방식

  • 작업이 순차적으로 진행
  • 현재 작업이 끝나야지 다음 작업으로 넘어갈 수 있음

비동기(Asynchronous) 방식

  • 여러 작업이 동시에 진행
  • 일부 작업이 완료되지 않아도 다른 작업으로 넘어갈 수 있음

14.3 이벤트 루프

이벤트 큐(이벤트 대기열)

  • 싱글 스레드에서 발생하는 이벤트들을 순서대로 등록
  • Future 관련 비동기 작업들도 하나의 이벤트로 인식

이벤트 루프

  • 앱이 실행하는 동안 끊임없이 이벤트를 처리
  • Future 관련 비동기 작업을 만나면 백그라운드로 이동시켜 따로 실행
  • Future 관련 비동기 작업 완료시 결과 값(데이터 or 에러)을 이벤트 큐에 다시 추가

14.4 async와 await 키워드

async

  • 함수가 비동기 방식으로 실행된다고 선언하며 항상 Future를 반환
    Future<String> fetchData() async{
        return Future.delayed(const Duration(seconds: 2), () => 'Data');
    }

await

  • 코드 진행을 잠시 멈추고 Future가 완료될때까지 기다리며 async와 함께 사용
    Future<String> fetchUser() async{
        String userName = await Future.delayed(const Duration(seconds: 2), () => 'I am Groot');
        return userName;
    }
    void main() async{ String name = await fetchUser(); print(name);}

await 예시(1)

    String createOrderMessage(){
        var order = fetchUserOrder();
        return 'your order is: $order';
    }

    Future<String> fetchUserOrder(){
        return Future.delayed(const Duration(seconds: 2), () =>'Large Latte');
    }

    void main(){
        print('Fetching user order...');//(1)
        print(createOrderMessage());//(2)
    }

실행결과
1. 'fetching user order...'
2. 'Your order is: Instance of '_Future''

await 예시(2)

    Future<String> createOrderMessage() async{
        print('Start');//(2)
        var order = await fetchUserOrder();//2초 기다림
        return 'your order is: $order';
    }

    Future<String> fetchUserOrder(){
        return Future.delayed(const Duration(seconds: 2), () =>'Large Latte');}

    void main() async{
        print('Fetching user order...');//(1)
        print( await createOrderMessage());//(3)
    }

실행결과
1. 'fetching user order...'
2. 'Start'
3. 'Your order is: Large Latte'

async나 await 쓰는 이유

  • 코드 가독성 향상
  • 앱 퍼포먼스 향상
  • 에러 핸들링
    void main() async{
        print('Before the Future');//(1)

        await Future((){
            print('Running the Future');//(2)
        }).then((_){
            print('Future is complete');//(3)
        });
    
        print('After the Future');//(4)
    }

14.5 try/catch 블록

try{}

  • 예외가 발생할 가능성이 있는 코드를 넣음

catch(e){}

  • try 블록에서 발생한 예외 객체를 e를 통해 받아 처리
    try{
        List<int> a = [1,2,3]; 
        print(a[3]); //예외발생시 출력x
    } catch(e){
        print("숫자가 존재하지 않습니다");
    }

try/catch 블록 예시

    void main() async{
        try{
            String data = await fetchData();
            print(data); //예외발생시 출력x
        } catch (error){
            print('데이터 처리 중에 에러가 발생했습니다');
        }
    }

    Future<String> fetchData(){
        return Future.delayed(const Duration(seconds: 2), (){
            return 'Data';
        });
    }

14.6 앱에서 Future 출력하기

실습


14.7 Stream과 StreamBuilder

Stream

  • 비동기 방식의 예측할 수 없는 많은 데이터를 다룰때 사용
    Future<int>//기다렸다가 사용 가능한 단일 데이터
    Stream<int>//기다렸다가 사용 가능한 복수 데이터

StreamBuilder

  • 플러터에서 제공하는 위젯으로 Stream 데이터 변화에 따라 위젯을 다시 빌드
  • Stream을 구독하는 역할로써 새로운 데이터 방출때마다 builder함수 호출

initialData 속성

  • StreamBuilder 초기값을 설정

stream 속성

  • StreamBuilder 수신하고 반응할 Stream 제공

builder 속성

  • StreamBuilder 상태 업데이트

실습

profile
안드로이드 네이티브 Kotlin과 크로스 플랫폼 Flutter를 잘 활용하면서 공익적 가치를 실현하는 앱 개발자

0개의 댓글