먼저, Hook이란 갈고리 라는 뜻을 의미합니다.
일반적으로 프로그래밍에서 '원래 존재하는 어떤 기능에 갈고리를 거는 것 처럼 끼어 들어가 같이 수행하는 것' 을 의미합니다.
React에서 'state와 생명주기 기능에 갈고리를 걸어 원하는 시점에 정해진 함수를 실행 되도록 만든 것' 의 의미로 사용됩니다.
이처럼 React에서 사용되는 hooks라는 기능에서 영감을 받아,
flutter에 맞도록 구현된 패키지 입니다.
flutter에서는 대표적으로 StatelessWidget
과 StatefulWidget이
있습니다.
상태관리를 사용할 경우에는 StatefulWidget을 사용하고,
그렇지 않은 경우에는 StatelessWidget을 사용합니다.
(상태관리 라이브러리를 별도로 사용하는 경우에는 StatelessWidget을 사용할 것 입니다.)
또한, 애니메이션 처리를 한다거나, 라이프사이클을 필요로 할때 StatefulWidget을 사용합니다.
이러한 것을 HookWidget으로 모든 것을 사용할 수 있도록 하였습니다.
이처럼 아래와 같이 기존의 코드를 간략하게 사용할 수 있습니다.
class Example extends StatefulWidget {
final Duration duration;
const Example({key? key, required this.duration}) : super(key: key);
_ExampleState createState() => _ExampleState();
class _ExampleState extends State<Example> with SingleTickerProviderStateMixin {
AnmiationController? _controller;
void initState() {
super.initState();
_controller = AnimationController(vsync: this, duration: widget.duration);
}
void didUpdateWidget(Example oldWidget){
super.didUpdateWidget(oldWidget);
if(widget.duration != oldWidget.duration) {
_controller!.duration = widget.duration;
}
}
void dispose(){
_controller!.dispose();
super.dispose();
}
Widget build(BuildContext context){
return Container();
}
}
}
class Example extends HookWidget {
const Example({Key? key, required this.duartion}) : super(key: key);
final Duration duration;
Widget build(BuildContext context){
/* useAnimationController의 메서드로 인해
애니메이션 컨트롤러의 생성부터 update, dispose까지 모두 처리가 가능합니다. */
final controller = useAnimationController(duration: duration);
return Container();
}
}
참고 문서:
https://pub.dev/packages/flutter_hooks
https://www.youtube.com/watch?v=GBVBLKESogU
https://thinkmath2020.tistory.com/3536