오늘의 문제점
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처럼 함수의 "참조"를 전달하거나, 익명 함수를 사용하는 방식이 맞다
올바른 사용 예시
- 함수 참조 전달:
FloatingActionButton( onPressed: model.test, // 참조만 전달 );- 익명 함수로 전달:
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 |