① 배운 것
typedef AsyncCallback = Future<void> Function();
이 코드는 Dart 프로그래밍 언어에서 사용되는 typedef 선언입니다.
typedef: 새로운 함수 타입을 정의합니다.
AsyncCallback: 새로 정의되는 함수 타입의 이름입니다.
Future<void>: 이 함수 타입이 반환하는 값의 타입입니다.
Future는 비동기 작업을 나타내며, <void> 는 이 비동기 작업이 완료되었을 때 특별한 값을 반환하지 않음을 의미합니다.
Function(): 이 함수 타입이 매개변수를 받지 않는다는 것을 나타냅니다.
종합하면, AsyncCallback은 "매개변수가 없고, 반환 값이 없는 비동기 함수"를 나타내는 타입이 됩니다. 이러한 typedef를 사용하면 코드의 가독성을 높이고 재사용성을 개선할 수 있습니다.
이 타입의 함수는 비동기 작업을 수행하지만 특정한 값을 반환할 필요가 없는 경우에 사용됩니다.
Dart 프로그래밍 언어에서 함수는 매우 중요한 역할을 합니다. 특히 Dart에서는 함수를 '일급 객체(first-class citizens)'로 취급합니다. 오늘은 이 개념에 대해 자세히 알아보고, AsyncCallback이라는 특별한 함수 타입을 예로 들어 설명해보겠습니다.
일급 함수(또는 일급 객체)란 프로그래밍 언어에서 함수를 다른 데이터 타입과 동일하게 취급하는 개념입니다. 구체적으로 다음과 같은 특징을 가집니다.
1. 변수에 할당할 수 있다.
2. 함수의 인자로 전달할 수 있다.
3. 함수에서 반환할 수 있다.
Dart에서 Function은 String이나 int와 같은 기본 데이터 타입 중 하나입니다. 이는 모든 함수의 기본 타입으로 사용됩니다.
다음 코드를 봐봅시다:
typedef AsyncCallback = Future<void> Function();
이 코드는 AsyncCallback이라는 새로운 타입 별칭(type alias)을 만듭니다. 이는 "매개변수가 없고 Future<void>를 반환하는 함수" 타입에 AsyncCallback이라는 이름을 부여한 것입니다.
AsyncCallback 타입의 함수는 일급 객체로 사용될 수 있습니다.
예를 들어:
// 변수에 할당
AsyncCallback myCallback = () async { print('Hello'); };
// 함수의 인자로 전달
void executeCallback(AsyncCallback callback) {
callback();
}
// 함수에서 반환
AsyncCallback getCallback() {
return () async { print('Returned callback'); };
}
AsyncCallback 타입의 함수가 일급 객체로 사용될 수 있는 이유는 Dart 언어에서 모든 함수 타입이 기본적으로 일급 객체로 취급되기 때문입니다. Function 데이터 타입 자체가 Dart에서 일급 객체이므로, 이를 기반으로 한 모든 함수 타입 (예: AsyncCallback)도 자연스럽게 일급 객체의 특성을 가집니다.
Dart에서 모든 함수는 일급 객체입니다. typedef를 사용하여 만든 AsyncCallback과 같은 함수 타입도 이 특성을 그대로 물려받습니다. 이를 통해 Dart에서는 함수를 유연하게 다룰 수 있으며, 이는 함수형 프로그래밍 패러다임을 지원하는 데 큰 역할을 합니다.
이러한 개념을 이해하면 Dart에서 더 강력하고 유연한 코드를 작성할 수 있습니다. 함수를 데이터처럼 다루는 능력은 현대 프로그래밍에서 매우 중요한 기술이므로, 이를 잘 활용하시기 바랍니다.
custom_refresh_indicator를 사용하여 pull to refreshf를 구현하고 있었는데 원래 customCirculatorIndicator가 최상단에서 당길때만 보여야하는데 항상 보이는 버그가 발생함.
알고보니 customCircurlarIndicator를 if (!controller.isIdle)
일때만 보이게 했어야했다.
controller.isIdle는 리프래시가 유휴중인지 판단하여 그렇지 않으면(리프래시 중이면) 인디케이터를 보이게 하는 로직이였다.
참고한 블로그
return CustomRefreshIndicator(
onRefresh: () {
return widget.onRefresh();
},
builder:
(BuildContext context, Widget child, IndicatorController controller) {
return Stack(
alignment: Alignment.topCenter,
children: [
if (!controller.isIdle) //👈
Positioned(
top: 20.0 * controller.value,
child: customCirculatorIndicator()
),
Transform.translate(
offset: Offset(0, controller.value),
child: child,
),
],
);
},
② 회고 (restropective)
③ 개선을 위한 방법