OnPressed 그리고 void call back 함수 / 익명함수

2024. 11. 18. 18:20·Flutter

오늘의 문제점

FloatingActionButton(
  onPressed: car.test(), // 
);

이런 코드가 있었을 때 나는 onPressd:에 냅다 car.test를 넣었다. 분명 컴파일 에러는 안나는데, 자꾸 동작하지 않아서

 

아,.. 이건 뭐지?

하고 혼란에 빠졌었다.

문제는 내가 보이드 콜백 함수에 대해 몰랏다는것

FloatingActionButton(
  onPressed: (){car.test();}
);

 

요렇게 해주니 잘 돌아간다.

무슨 차이일까!!!

 

 


1. car.test()

  • 즉시 실행:
    • 이 형태는 함수가 호출되고, 바로 실행됨
    • Flutter에서 onPressed와 같은 이벤트 핸들러에 사용하면, 버튼을 누르기 전에 이미 함수가 실행됨

예제

FloatingActionButton(
  onPressed: model.test(), // 잘못된 사용!
);

결과:

  • 화면이 빌드될 때 car.test()가 바로 실행됨! 
  • onPressed가 함수 참조를 받아야 하는데, 이미 실행된 결과를 넘겨주므로 오류를 발생시키거나 예상치 못한 동작을 한다 

2. () { car.test(); }

  • 콜백 함수 전달:
    • 익명 함수(람다)를 정의하고, 버튼을 누르면 실행되도록 전달
    • 버튼 클릭 시에만 car.test()가 호출

예제

FloatingActionButton(
  onPressed: () {
    car.test(); // 버튼 클릭 시 실행
  },
);

결과:

  • 화면이 빌드될 때 함수는 실행되지 않음 
  • 버튼을 클릭했을 때만 'car.test()`가 호출됨

3. 왜 car.test()는 바로 실행되고, (){ car.test(); }는 나중에 실행되는가?

car.test()의 의미:

  • 이 코드는 함수를 호출하여 실행
  • 즉, 실행 결과를 onPressed에 전달하려는 시도이므로 Flutter는 함수 참조가 아니라 실행 결과를 받는다.

() { car.test(); }의 의미:

  • 이 코드는 익명 함수 정의입니다.
  • Flutter는 정의된 함수를 onPressed에 전달하므로, 버튼을 클릭했을 때만 호출된다 

4. 해결 방법

onPressed는 함수 참조를 요구하므로, car.test처럼 함수의 "참조"를 전달하거나, 익명 함수를 사용하는 방식이 맞다 

올바른 사용 예시

  1. 함수 참조 전달:
  2. FloatingActionButton( onPressed: model.test, // 참조만 전달 );
  3. 익명 함수로 전달:
  4. FloatingActionButton( onPressed: () { model.test(); // 클릭 시 실행 }, );

5. 정리

형태 동작
car.test() 화면이 빌드될 때 바로 실행됨. onPressed에 실행 결과를 전달하므로 올바르지 않음.
() { car.test(); } 익명 함수 정의. 버튼 클릭 시에만 model.test()가 호출되므로 Flutter의 onPressed에 적합.
car.test 함수 참조 전달. Flutter가 버튼 클릭 시 직접 실행할 수 있도록 함. (car.test()와 혼동하지 말 것!)

 


() { car.test(); }는 클릭할 때 실행되고, model.test()는 즉시 실행된다는 차이만 명확히 기억하면 된다!!!!

 

 

 

🔑

void call back 함수는 "이 함수는 일을 한다. 하지만 결과를 줄 필요는 없다!"
라고 선언하는 함수임

 

+)

 

익명함수는 ?

함수 이름 대신 바로 정의해서 사용하는 함수, 필요한 곳에 쓰이고 버린다. 🗑️

 

1) 이름 없는 함수

(parameter) {
  // 실행할 코드
}

 

2) 람다 형태

(parameter) => 실행할 코드;
저작자표시 비영리 동일조건 (새창열림)

'Flutter' 카테고리의 다른 글

Flutter With BLE (작성중)  (0) 2024.12.12
2. 앱에 어울리는 애니메이션 구현하기 <AnimationContainer 편>  (0) 2024.09.16
핫 리로드는 정말 좋은거구나  (3) 2024.08.28
'Flutter' 카테고리의 다른 글
  • Flutter With BLE (작성중)
  • 2. 앱에 어울리는 애니메이션 구현하기 <AnimationContainer 편>
  • 핫 리로드는 정말 좋은거구나
복복씨
복복씨
개발자여, 사고하라 !
  • 복복씨
    정리노트
    복복씨
  • 전체
    오늘
    어제
    • 분류 전체보기 (118)
      • 개발새발자 (21)
        • 의 삶 (7)
        • 의 회고 (9)
        • 의 낙서장 (5)
        • 영어 (0)
      • FrontEnd (1)
        • React (1)
      • Flutter (38)
        • 새싹 (5)
        • Dart (8)
        • Flutter (14)
        • iOS 에서 Flutter 로 전환하며 (2)
        • 챗지피티랑놀.기 (3)
        • 하루 한 입 플러터 (2)
      • CS (7)
        • 짤막지식 (6)
      • IOS (6)
        • Swift (0)
        • UIKit (1)
        • SwitUI (4)
      • 머신러닝-딥러닝 (28)
        • 논문리뷰 (3)
        • study (16)
        • Kaggle (9)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    FLUTTER
    부트캠프
    flutter 애니메이션
    unawaited
    플러터 di
    expando
    새싹 플러터
    멋쟁이 사자처럼
    깊은참조
    테킷 앱스쿨
    핫 리로드
    사그널링서버
    IOS
    한주 회고
    runzonedguarded
    Flutter Lifecycle
    코드 결합도
    새싹
    dart
    용산캠
    시그널링데이터
    새싹 용산
    initState()
    플러터 새싹
    getit
    futurerecord2
    플러터
    flutter lottie
    schedulemicrotask
    swiftui 플러터
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
복복씨
OnPressed 그리고 void call back 함수 / 익명함수
상단으로

티스토리툴바