React ํ์ ์ต๊ทผ ํํฌ๋ฅผ ๋ฐํํ์ต๋๋ค: https://medium.com/@dan_abramov/making -sense-of-react-hooks-fdbde8803889. Flutter๊ฐ React์ ์ผ๋ง๋ ์ ์ฌํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด Flutter์๋ ๋ง๋์ง ํ์ธํ๋ ๊ฒ์ ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค.
ํํฌ๋ StatefulWidget
State
์ ๋งค์ฐ ์ ์ฌํ์ง๋ง ํ ๊ฐ์ง ์ฃผ์ ์ฐจ์ด์ ์ด ์์ต๋๋ค. ์์ ฏ์์ ์ํ๋ ๋งํผ ํํฌ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
ํํฌ๋ State
(๋๋ ์์ ๋ ๋ฒ์ )์ ์๋ ๋ชจ๋ ์๋ช
์ฃผ๊ธฐ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
ํํฌ๋ ์ฃผ์ด์ง ์์ ฏ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ๋์ ํน์ ์์ ฏ ์ ํ์๋ง ์ฌ์ฉํ ์ ์๋ State
์๋ ๋์กฐ์ ์
๋๋ค.
Hooks๋ ์ถฉ๋์ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ์ํผ ๋ฏน์ค์ธ๊ณผ ๋ค๋ฆ
๋๋ค. ํํฌ๋ _์์ ํ_ ๋
๋ฆฝ์ ์ด๋ฉฐ ์์ ฏ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
์ฆ, Hook์ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ์ฅํ๊ณ ์ถฉ๋์ ๋ํ ๋๋ ค์ ์์ด ๊ณต๊ฐ์ ์ผ๋ก ๋
ธ์ถํ ์ ์์ต๋๋ค. ๋ํ ๋ฏน์ค์ธ๊ณผ ๋ฌ๋ฆฌ ๋์ผํ Hook์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฌ์ฉํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
ํํฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฐ์ด์ Element
๋ด์ ์ ์ฅ๋ฉ๋๋ค. ์์ ฏ์ build
๋ฉ์๋ ๋ด์์๋ง ์ก์ธ์คํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํํฌ๋ ๋ฌด์กฐ๊ฑด ์ ๊ทผํด์ผ ํฉ๋๋ค. ์:
ํ๋ค:
Widget build(BuildContext context) {
Hook.use(MyHook());
}
ํ์ง๋ง:
Widget build(BuildContext context) {
if (condition) {
Hook.use(MyHook());
}
}
์ด ์ ํ์ ๋งค์ฐ ์ ํ์ ์ผ๋ก ๋ณด์ผ ์ ์์ง๋ง ํํฌ๊ฐ ์ธ๋ฑ์ค์ ์ํด ์ ์ฅ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ค์ ์ ํ๋ ์ด๋ฆ๋ ์๋๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ถฉ๋ ์์ด ์ํ๋ ๋งํผ ๋์ผํ ํํฌ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
Hooks์ ๊ฐ์ฅ ์ ์ฉํ ๋ถ๋ถ์ ์๋ช ์ฃผ๊ธฐ ๋ก์ง์ โโ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์๋ก ์ถ์ถํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
Flutter ์์ ฏ์ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ค ํ๋๋ AnimationController
์ ๊ฐ์ ์ผํ์ฉ ๊ฐ์ฒด์
๋๋ค.
์ผ๋ฐ์ ์ผ๋ก initState
๋ฐ dispose
์ฌ์ ์๊ฐ ๋ชจ๋ ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์์ ์ ์ง ๊ด๋ฆฌ์์ ์ด์ ๋ก ๋ฏน์ค์ธ์ผ๋ก ์ถ์ถํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ผ๋ฐ์ ์ธ ์ฝ๋ ์ค๋ํผ๋ก ์ด์ด์ง๋๋ค: stanim
class Example extends StatefulWidget {
<strong i="7">@override</strong>
ExampleState createState() => ExampleState();
}
class ExampleState extends State<Example>
with SingleTickerProviderStateMixin {
AnimationController _controller;
<strong i="8">@override</strong>
void initState() {
super.initState();
_controller = AnimationController(vsync: this, duration: const Duration(seconds: 1));
}
<strong i="9">@override</strong>
void dispose() {
super.dispose();
_controller.dispose();
}
<strong i="10">@override</strong>
Widget build(BuildContext context) {
return Container(
);
}
}
Hooks๋ ๋ผ์ดํ ์ฌ์ดํด ๋ก์ง์ ์ถ์ถํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด๊ฒ์ ์ ์ฌ์ ์ผ๋ก _ํจ์ฌ_ ์์ ์ฝ๋๋ก ์ด์ด์ง๋๋ค.
class Example extends StatelessWidget {
<strong i="15">@override</strong>
Widget build(BuildContext context) {
AnimationController controller = useAnimationController(duration: const Duration(seconds: 1));
return Container(
);
}
}
์ด๋ฌํ ํํฌ์ ์์งํ ๊ตฌํ์ ๋ค์ ๊ธฐ๋ฅ์ผ ์ ์์ต๋๋ค.
AnimationController useAnimationController({Duration duration}) {
// use another hook to obtain a TickerProvider
final tickerProvider = useTickerProvider();
// create an AnimationController once
final animationController = useMemoized<AnimationController>(
() => AnimationController(vsync: tickerProvider, duration: duration)
);
// register `dispose` method to be closed on widget removal
useEffect(() => animationController.dispose, [animationController]),
// synchronize the arguments
useValueChanged(duration, (_, __) {
animationController.duration = duration;
});
return animationController;
}
useAnimationController
๋ "ํํฌ" ์ค ํ๋์
๋๋ค.
์ด๋ฌํ ํํฌ์ ์์งํ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ ์ฝ๋๋ State
ํด๋์ค์ ์ต์ํ ๋๊ตฐ๊ฐ์ ์ ์ฌํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ์ ์ด ์์ต๋๋ค.
AnimationController
๋ฅผ ์์ ํ ์ฒ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ํ ์
๋ฐ์ดํธํฉ๋๋ค.initState
AnimationController
๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ํซ ๋ฆฌ๋ก๋ ์ duration
์
๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.ํํฌ์๋ ๋น์ฉ์ด ๋ฐ๋ฆ
๋๋ค. ๊ฐ์ ๋ํ ์ก์ธ์ค์๋ InheritedElement
์ ์ ์ฌํ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค. ๋ํ ํด๋ก์ ๋๋ "์์ ฏ"๊ณผ ๊ฐ์ ์๋ช
์ด ์งง์ ๊ฐ์ฒด์ ์๋ก์ด ์ธํธ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
์ค์ ์ฐจ์ด๋ฅผ ๋ณด๊ธฐ ์ํด ์์ง ๋ฒค์น๋งํฌ๋ฅผ ์คํํ์ง ์์์ง๋ง
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ํซ ๋ฆฌ๋ก๋์ ๊ดํ ๊ฒ์ ๋๋ค.
๊ด์ฐฎ์ผ๋ฉด ๋ชฉ๋ก ๋์ ํํฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ํํฌ๋ ์์์ ๋ฐ๋ผ ์๋ํ๋ฏ๋ก ๊ธฐ์กด ํํฌ ์ค๊ฐ์ ํํฌ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ถ๋ถ ์ํ ์ฌ์ค์ ์ด ๋ฐ์ํฉ๋๋ค. ์์:
A, B
์์ A, C, B
๋ก ์ด๋ํ๋ฉด B
์ ์ํ๊ฐ ์ฌ์ค์ ๋ฉ๋๋ค( dispose
๋ฐ initHook
๋ฅผ ๋ค์ ํธ์ถ).
Hooks๋ ๋ ํฐ ์ฝ๋ ์ฌ์ฌ์ฉ์ ํ์ฉํ์ฌ ์์ ฏ ์ธ๊ณ๋ฅผ _๋ง์ด_ ๋จ์ํํฉ๋๋ค. ํนํ ํ๊ธฐ, ๋ฉ๋ชจ ์์ฑ ๋ฐ ๊ฐ์น ๊ด์ฐฐ๊ณผ ๊ฐ์ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์์.
StatefulWidget์ ์์ ํ ๋์ฒดํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ง์์ ์ ํ์ด ํ์ํ๊ณ ๋ฆฌํฉํ ๋ง ์ ๋ถ๋ถ ์ํ ์ฌ์ค์ ์ด ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ์ ์ ์์๋ฅผ ์์ฑํ์ฌ Flutter ์ธ๋ถ์์ ํํฌ๋ฅผ ์ถ์ถํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ํ์ฌ๋ก์๋ ์์ค๋ฅผ ์์ ํ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํํฌ์ ํน์์ฑ์ผ๋ก ์ธํด ๋ง์ถคํ ๋ฆฐํฐ๋ฅผ ์ฌ์ฉํ๋ฉด _๋ง์_ ์ด์ ์ด ์์ต๋๋ค. ํ์ฌ ์ ๊ณตํ ์ ์๋ ์ธ๋ถ ํจํค์ง.
~์งํ ์ค์ธ ๊ตฌํ์ ์ฌ๊ธฐ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค: https://github.com/rrousselGit/flutter_hooks (์ต์ ๊ธฐ๋ฅ์ prod-ready
๋ถ๊ธฐ์ ์์ต๋๋ค).~
~๊ณง ์ํ ๋ฒ์ ์ผ๋ก ์ถ์๋ ์์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ ๊ตฌํ์ ์ด๋ ์ ๋ ์๋ํฉ๋๋ค.~
https://pub.dartlang.org/packages/flutter_hooks# -readme-tab-์์ ์ฌ์ฉ ๊ฐ๋ฅ
@Hixie @eseidelGoogle
๋ค์์ ๋ด๊ฐ ์ผ๋์ ๋ ๋ช ๊ฐ์ง ์ธ๋ถ ์ฌํญ๊ณผ ํจ๊ป https://twitter.com/ericmander/status/1070024779015479302 ์ ๋ํ ํ์ ์กฐ์น์ ๋๋ค. Flutter ํ์ด ํด๋น ์ฃผ์ ์ ๋ํด ์ถ๊ฐ ํฌ์๋ฅผ ์ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ
์๋
ํ์ธ์ @rrousselGit ์ ์ ์ ๊ทํ์ flutter_hooks ํจํค์ง๋ฅผ ๋ณด๊ณ ์์์ต๋๋ค. Flutter์์ ๊ตฌํํ๊ธฐ ์ํด ์ด๋ค ์ต์
์ด ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง HookContext๋ฅผ ํตํด ํํฌ ๋ฉ์๋๋ฅผ ์ ๋ฌํ๋ ๋ฐ๋ฉด React์์๋ ํํฌ๋ฅผ ๋ณ๋๋ก ์์ฑํ ์ ์์ผ๋ฉฐ ์ผ์ข
์ "์ํ ๋ฏน์ค์ธ"์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฃผ์ ์ฐจ์ด์ ์ flutter_hooks
๋ ๋ชจ๋ ํํฌ ๋ฉ์๋๋ฅผ ํจํค์ง์ ๋น๋ํด์ผ ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง React๋ ํํฌ ๋ฉ์๋๋ฅผ ์์ ํ ๋ถ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
์ด๊ฒ์ React ์ฌ์์ ์ผ์น์ํค๋ ๋ฐ ์ค์ํ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ด ์ด๋ป๊ฒ ๋ฌ์ฑ๋ ์ ์๋์ง์ ๋ํ ์๊ฐ์ด ์์ต๋๊น?
ํธ์ง :
HookContext
๊ฐ ์ ๊ฑฐ๋์์ผ๋ฉฐ ๋ชจ๋ ํํฌ๋ ์ด์ ์ ์ ๋ฉ์๋์
๋๋ค. ๋ฐ๋ผ์ ๋ค์์ ์ด์ ๊ตฌ์์
๋๋ค.
๋ด ํจํค์ง๋ ์๋ ์์ฑ์ ์ํด ๊ทธ๋ ๊ฒ ํ์ง๋ง ํ์๋ ์๋๋๋ค.
๋์ ์
context.useSomeHook()
์ฐ๋ฆฌ๋ ๊ฐ์ง ์ ์์ต๋๋ค
useSomeHook(context)
์ด๊ฒ์ ๊ฒ์ ๊ฐ๋ฅ์ฑ ์ธ์๋ ์๋ฌด๊ฒ๋ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
์ฃผ์ ๊ธฐ๋ฅ์
T HookContext.use<T>(Hook);
๊ฑฐ๊ธฐ์์ ์์ ์ ํํฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ๋ง ์์ผ๋ฉด React๊ฐ ํ๋ ๋ชจ๋ ๊ฒ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํํฌ์ ํน์์ฑ์ผ๋ก ์ธํด ๋ง์ถคํ ๋ฆฐํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ง์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. ํ์ฌ ์ ๊ณตํ ์ ์๋ ์ธ๋ถ ํจํค์ง.
๋๋ ๋น์ ์ด upvote๋ฅผ ์ถ์ฒํฉ๋๋ค (๊ทธ๋ฆฌ๊ณ ๋น์ ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ์ญ์์ค)
https://github.com/dart-lang/linter/issues/697. ํจํค์ง๊ฐ ๊ณ ์ ํ ๋ง์ถค ๋ฆฐํธ๋ฅผ ์ ๊ณตํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ํซ ๋ฆฌ๋ก๋์ ๊ดํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๋๋ฅผ ๊ฑฑ์ ์ํจ๋ค. ํซ ๋ฆฌ๋ก๋ ๊ฒฝํ์ ์ ํ์ํค๋ฉด ์ฌํ ๊ฒ์ ๋๋ค.
https://pub.dartlang.org/packages/flutter_hooks ์์ ์ฌ์ฉ ๊ฐ๋ฅ
์ด๊ฒ์ Flutter ํ๋ ์์ํฌ์ ๊ตฝ๋ ๊ฒ์ ์ฅ์ ์ด ์ธ๋ถ ํจํค์ง๋ฅผ ๊ฐ๋ ๊ฒ๋ณด๋ค ๋ฌด์์ธ์ง ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
ํซ ๋ฆฌ๋ก๋์ ๋ํด ํตํฉํ๋๋ฐ ์ฌ์ฉํ๊ธฐ๊ฐ ๋ถ๋๋ฝ์ต๋๋ค.
์ ์ผํ ์ง์ง ๋ฌธ์ ๋ #26503์ด๋ฉฐ, ์์ ํ๋ ค๋ฉด ๋๊ตฌ๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ ํ ๋์ญํญ์ด ์์ต๋๋ค.
ํํฌ๋ฅผ Flutter์ ํตํฉํ์ฌ ๊ฐ์ ธ์ฌ ์ ์๋ ์ฌ๋ฌ ๊ฐ์ง ์์ ๊ฐ์ ์ฌํญ์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. Hook์ React์์ ๋๊ท๋ชจ ์์ ์ ์ผ๋ถ์ธ ๋น๋๊ธฐ ๋ ๋๋ง์ ๋๋ค.
Flutter๊ฐ Async Rendering ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด(๊ทธ๋ฆฌ๊ณ ๊ทธ๋์ผ ํ๋ ๊ฒฝ์ฐ) ๋ ๊ฐ์ง๊ฐ ํ์ํฉ๋๋ค.
๋ช ๋ฐฑํ ์ปค๋ฎค๋ํฐ ์ธก๋ฉด๋ ์์ต๋๋ค. ๋ด๊ฐ ์ค์ ๋ก ๊ด๊ณ ํ์ง ์์ ์ํ์์ ํ ๋ฌ์ 270๊ฐ์ ๋ณ๊ณผ https://github.com/trending/dart?since=monthly ์ ํ ์๋ฆฌ๊ฐ ์๋ - ํํฌ๋ ํ์คํ ์ปค๋ฎค๋ํฐ์ ๊ด์ฌ์ ๋์ด๋ ๊ฒ์ ๋๋ค.
ํํฌ์ ๋ชฉํ๋ ์์ ฏ์ ๊ตฌ๋ฌธ์ ๋ณ๊ฒฝํ์ฌ ์ฌ๋๋ค์ด ๋ผ์ดํ์ฌ์ดํด ํน์ ๋ก์ง์ pub์ ๊ณต์ ํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
ํํฌ๊ฐ ๊ณต์์ ์ผ๋ก ์ง์๋๋ฉด ์ปค๋ฎค๋ํฐ์ ๋ ธ๋ ฅ์ด ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค.
ํธ๊ธฐ์ฌ: ํซ ๋ฆฌ๋ก๋์์ ์ด๋ป๊ฒ ์๋ํ๊ฒ ํ๋์ง ์ค๋ช ํด์ฃผ์ค ์ ์๋์?
reassemble
์ ์ก์ธ์คํ ์ ์๋๋ก ComponentElement ๋์ StatefulElement๋ฅผ ํ์ฅํ์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ค์ build
ํธ์ถ์ด ํํฌ ๋ชฉ๋ก์ ๋ณ๊ฒฝํ๋ ๋์์ ์ ์์ ์ธ ์ฌ๊ตฌ์ถ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ ๋ ์ธ๋ฑ์ค์์ previousHook.runtimeType != newHook.runtimeType
์ด๋ฉด ์ด ํํฌ์ ๋ค์ ๋ชจ๋ ํญ๋ชฉ์ด ์ญ์ ๋ฉ๋๋ค.
"๋ค์ ๋ชจ๋" ๋ถ๋ถ์ ํํฌ๊ฐ ๋ค๋ฅธ ํํฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์ ํ๋๋ง ์ ๊ฑฐํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
ํ ๋ฌ ๋์ ๊พธ์คํ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ๊ฑฐ์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
์ค์ ๋ก๋ ๊ทธ ๋ฐ๋์
๋๋ค. ํซ ๋ฆฌ๋ก๋ ๊ฒฝํ์ด ํฅ์๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด build
๋ฉ์๋ ๋ด์ ์์ผ๋ฏ๋ก ํซ ๋ฆฌ๋ก๋๋ ํญ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํฉ๋๋ค( initState
์ ๋ฐ๋). ์ผ๋ฐ์ ์ธ ์๋ AnimationController
์
๋๋ค.
final animationController = useAnimationController(duration: const Duration(second: 1));
์ด ํํฌ๋ ์ง์ ์๊ฐ์ ๋ถ๋๋ฌ์ด ํซ ๋ฆฌ๋ก๋๋ฅผ ํ์ฉํฉ๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ํซ ๋ฆฌ์คํํธ๊ฐ ํ์ํ ๊ฒ์ ๋๋ค.
์ผ๋ถ ์์ฉ๊ตฌ๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ฉ์ธ ์ฑ์ ์ผ๋ถ๋ฅผ ๋ฒ์ญํ๊ธฐ ์์ํ์ต๋๋ค. ๋๋ Hooks๋ฅผ ๊ธฐ๋ฅ์ด ์๋๋ผ ์์ ํ ํจํด์ผ๋ก ๋ด ๋๋ค. ๊ตฌํ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ๋ง์ ์ฃผ์ ๋ก ์์ฐ์ฑ์ ๋ฌผ๋ก ์ ์ง ๊ด๋ฆฌ์๋ ํฐ ์ด์ ์ด ์์ต๋๋ค. ์ ๋ ์ ๋๋ฉ์ด์ ์ผ๋ก ์์ํ์ฌ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ๊ฑฐํ์ผ๋ฉฐ Firebase์ฉ Hooks ๋๋ ๊ธฐํ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค.
์ค์ ๋ก๋ ๊ทธ ๋ฐ๋์ ๋๋ค. ํซ ๋ฆฌ๋ก๋ ๊ฒฝํ์ด ํฅ์๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋น๋ ๋ฉ์๋ ๋ด์ ์๊ธฐ ๋๋ฌธ์ ํซ ๋ฆฌ๋ก๋๋ ํญ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํฉ๋๋ค(initState์ ๋ฐ๋).
๐ ๋๋ ์ฒ์ ์ธ๋ฐ์ค์ฐฌ์ ์ ์์ ๋ณธ ์ง ๋ช ์ฃผ ๋ง์ ๊นจ๋ฌ์๋ค.
"๋ค์ ๋ชจ๋" ๋ถ๋ถ์ ํํฌ๊ฐ ๋ค๋ฅธ ํํฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ํ๋๋ง ์ ๊ฑฐํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
๋ํ JS์์๋ ํด๋ฆฌ์คํฑ์ด ๋์์ด ๋ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ํซ ๋ฆฌ๋ก๋ฉ์ผ๋ก ์ธํด render
(Flutter์ build
)๊ฐ ๋ฐ์ํ๋ฉด(์: ์ผ์นํ์ง ์๋ ์ ํ์ผ๋ก ์ธํด) ๋ชจ๋ Hooks ์ํ๋ฅผ ์ฌ์ค์ ํ๊ณ ๋ค์ ์๋ํฉ๋๋ค. ๋ค์ ์คํจํ๋ฉด ์ฐ๋ฆฌ๋ ์คํจํฉ๋๋ค.
ํ์ดํ์ด ๊ฐํด์ ์ด๋ฐ ๋ฌธ์ ๋ ์๋ ๊ฒ ๊ฐ์๋ฐ์? ์ ๋ชจ๋ฅด๊ฒ ์ด. ๋ฌธ์์ด ์ํ Hook์ผ๋ก ํธ์ง์ ์์ํ ๋ค์ ์ฝ๋๋ฅผ ์ซ์๋ก ๊ฐ์ ํ๋๋ก ๋ณ๊ฒฝํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
๋ฌธ์์ด ์ํ Hook์ผ๋ก ํธ์ง์ ์์ํ ๋ค์ ์ฝ๋๋ฅผ ์ซ์๋ก ๊ฐ์ ํ๋๋ก ๋ณ๊ฒฝํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น?
๋ค์์์ ์ถ๋ฐํ๋ค๋ ๋ป์ ๋๋ค.
final counter = useState(0)
์๊ฒ:
final name = useState('foo');
?
๊ทธ๋ ๋ค๋ฉด ์
๋ ฅ ์์คํ
์ ์ ํ์ด ๋ณ๊ฒฝ๋์์์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฐ์งํฉ๋๋ค. useState
์ ์ ํ์ด ์ค์ ๋ก useState<int>
๋ useState<String>
์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
JS๋ ์ฌ๊ธฐ์ ๋ ํ๋ ์๊ฐ์ ๋ณด๋ผ ๊ฒ์ ๋๋ค.
๋๋ ์ด๊ฒ์ด ๋น์ ์ ๊ตฌํ๋ ๊ฒ์ ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ดํดํ๊ธฐ ์ฌ์ด ์ ์ธ ํ๋, initState์์ ์ดํดํ๊ธฐ ์ฌ์ด ์ค ํ๋, dispose์์ ์ดํดํ๊ธฐ ์ฌ์ด ์ค ํ๋๊ฐ ๋น๋ ๋ฉ์๋์์ ๋ ํจ์จ์ ์ด๊ณ ์์ ํ ๋ถํฌ๋ช ํ ์ค๋ก ๋์ฒด๋ฉ๋๋ค(์ฌ๊ธฐ์ ์ฑ๋ฅ์ ๋นํ์ ์ธ). ์ข์ ๊ฑฐ๋๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด์ ์ ๋ํด ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
(์ฆ, https://pub.dartlang.org/packages/flutter_hooks๋ ์ด๋ฏธ ์ฌ๊ธฐ์ ๋ชจ๋ ๊ฒ์ ๊ตฌํํ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ํ๋ซํผ์ ์๋ฌด๊ฒ๋ ์ถ๊ฐํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.)
Hooks๋ React๊ฐ ์๋ ๊ฐ ์ง๋ฉดํ ๋ฌธ์ ์ ๋ํ ํ๋์ ์๋ฃจ์ ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ Flutter๊ฐ React์์ ๋ง์ ์๊ฐ์ ์ป์ผ๋ฉด์ ์ด๋ฌํ ๋ฌธ์ ๋ ๊ฐ์ ธ์์ต๋๋ค.
์ ๋ ๋ง์ผํ ์ ์์ง์ด ์์ผ๋ฏ๋ก ์ด์ ๋ํ React Team์ ์ด์ผ๊ธฐ๋ฅผ ์์ฒญํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ค์ ์๊ฐ๋ https://youtu.be/dpw9EHDh2bM์์ ์์๋ฉ๋๋ค.
Dan Abramov์ ์ ํ ๋น๊ต(์์ ๋ช ๊ฐ์ง ์ค๋ช ์ ๋ํ ๋ต๋ณ)๊ฐ ์ด์ด์ง๋๋ค.
์์ ์ ๊ทธ๋ค์ด ๊ทธ ๋ํ์ ์๋ ๋ชจ๋ ๊ฒ์ด Flutter์๋ ์ ์ฉ๋๋ค๋ ๊ฒ์ ๋๋ค(mixins๊ฐ ์ ํดํ๋ค๋ ๋ธ๋ก๊ทธ๋ฅผ ํฌํจํ์ฌ https://reactjs.org/blog/2016/07/13/mixins-considered-harmful.html).
์ฆ, ํํฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋์ ๋๋ ๋ฌธ์ฅ์ผ๋ก ์์ฝ๋ ์ ์์ต๋๋ค.
ํํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋ง์ ๋น์จ์ '๊ณต๊ฐ'ํ ์ ์์ต๋๋ค.
์์ ฏ์์ ํํฌ๋ฅผ ์์ ํ ์ถ์ถํ์ฌ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ๊ฒ์ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ฐ๋ฆฌ์ ๋
ผ๋ฆฌ๊ฐ State
์๋ช
์ฃผ๊ธฐ์ ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์ ํ์ฌ๋ก์๋ StatefulWidget
์์๋ ๋ถ๊ฐ๋ฅํ ์ผ์
๋๋ค.
ํํฌ์ ๋ ๋ค๋ฅธ ํจ๊ณผ๋ ์ฝ๋๊ฐ ๊ทธ๋ฃนํ๋๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ๋ค๋ ๊ฒ์ ๋๋ค. ํ์ฌ ๋ค์์ด ์์ต๋๋ค.
initState() {
a = A(widget.foo);
b = B(widget.bar);
}
didUpdateWidget(SomeWidget old) {
if (old.foo != widget.foo) {
a.foo = widget.foo;
}
if (old.bar != widget.bar) {
b.bar = widget.bar;
}
}
dispose() {
a.dispose();
b.dispose();
}
๋ชจ๋ ๊ฒ์ด ์ฌ๋ฌ ๋ผ์ดํ ์ฌ์ดํด์ ๊ฑธ์ณ ํผํฉ ๋ฐ ๋ถํ ๋ฉ๋๋ค. ๋ณ์๋ฅผ ์ญ์ /์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์์๋์ง ํ์ธํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์์ง๋๋ค.
ํํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
final a = useMemoized(() => A(foo));
useValueChanged(foo, () => a.foo = foo});
useEffect(() => a.dispose, [a]);
final b = useMemoized(() => B(bar));
useValueChanged(bar, () => b.bar = bar});
useEffect(() => b.dispose, [b]);
์ด์ ๋ชจ๋ ๊ฒ์ด ์ฌํธ์ฑ๋์์ต๋๋ค. ๋ณ์๋ฅผ ์ญ์ /์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์์ด๋ฒ๋ ธ๋์ง ์ฌ๋ถ๋ ํจ์ฌ ๋ ๋ถ๋ช ํด์ง๋ฉฐ ํด๋น ๋ ผ๋ฆฌ๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๋ชจ๋ ์์ ์ ์ํํ๋ ์ ์ ํจ์๋ก ์ฝ๊ฒ ์ถ์ถํ ์ ์์ต๋๋ค.
ํํฌ๋ DRY์ ๋ฐ๋ฆ ๋๋ค. ๋ณ์๋ฅผ ์์ฑ/์ ๋ฐ์ดํธ/ํ๊ธฐํ๋ ๋ ผ๋ฆฌ๋ฅผ ํ ๋ฒ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๋ ๋์ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฌ์ฉํฉ๋๋ค.
์๊ฐ์ ์(React์์):
์ ๋ฐ์ ์ผ๋ก Flutter ์ ์ฅ์ ์ธ๋ถ์์ ํํฌ๋ฅผ ๊ตฌํํ ์ ์๋ค๋ ๊ฒ์ด ๋๋์ต๋๋ค. ๊ทธ๋๋ก ์์ด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
Flutter๊ฐ Widget
๊ธฐ๋ณธ ํด๋์ค๋ง ์ ๊ณตํ๊ณ StatefulWidget
๋ฅผ ์ธ๋ถ ์ข
์์ฑ์ผ๋ก ๋ง๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ด์น์ ๋ง์ง ์์ต๋๋ค.
Flutter๋ ํ๋ ์์ํฌ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ๋ง ์ ๊ณตํ๊ณ ์ถ์ง ์์ต๋๋ค.
์ด๋ ๋ํ ๋ค์์ ์ํ ๊ฒ์์ ์๋ฏธํฉ๋๋ค.
์ฌ๊ธฐ์๋ ์์ฒญ๋ ์์ ์์
์ด ํ์ํ๊ณ Flutter์์ ์ฌ๋ฌ PR์ด ํ์ํ ์ ์์ต๋๋ค.
ํ ์ฌ๋์ด ์ฌ๊ฐ ์๊ฐ์ ์ ์ง ๊ด๋ฆฌํ๋ ์์ ํจํค์ง์ ๋ฒ์์๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋๋ค.
ํํฌ๋ DRY์ด๋ฉฐ ์ฝ๋์ ๊นจ๋ํ ๊ณต๋ ๋ฐฐ์น๋ฅผ ์ด์งํ๋ ๋น์ฆ๋์ค ๋ก์ง/์ํ ๋ฏน์ค์ธ์ ๋๋ค. ๋์์ ์ฝ๋๋ฒ ์ด์ค์์ ๋จํธํ๋ ๋ฐ๋ณต์ ๋๋ค.
์ข ์ด์์๋ ๋ ๋ถํฌ๋ช ํ์ง๋ง ํจํด์ ๋ฐ๋ณต ๊ฐ๋ฅํ๊ณ ์ดํดํ ์ ์์ผ๋ฏ๋ก ํ๋ฃจ๊ฐ ์ง๋๋ฉด ํฌ๋ช ํด์ง๋๋ค. ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ํจํด๊ณผ ๊ฐ์ต๋๋ค. ์์ํ ๋๋ ๋ถํฌ๋ช ํ๊ณ ์ฌ์ฉํ ๋๋ ํฌ๋ช ํ์ง๋ง Hooks๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ์ด ๊ฑฐ์ ์ฆ๊ฐ์ ์ ๋๋ค.
๋ฐ์์์ ๋ง์ ๊ฐ๋ฐ์๋ ํํฌ๊ฐ ์๋ ํด๋์ค ๊ตฌ์ฑ ์์์ ์์กดํ์ง ์์๋ ๋๋ ๋ง์ ๊ฒฝ์ฐ๋ฅผ ๋ง๋ ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๊น์ด ์ฅ๋์ ๊ธฐ๋ฅ์ ๊ตฌ์ฑ ์์๊ฐ ๋ฌด๋์ ์ค์ฌ์ ์ค๋ฅผ ๊ฒ์ ๋๋ค.
๋ด ์์งํ ์ง๋ฌธ์ ํ๋ฌํฐ์์ ๊ธฐ๋ฅ์ ์์ ฏ์ ์ง์ํ๋ ๊ฒ๋ ์๋ฏธ๊ฐ ์๋์ง ์ฌ๋ถ์ ๋๋ค. ํ์ฌ ๊ธฐ๋ฅํ๋ ์์ ฏ์ ์์ฒด Element์ ์ฐ๊ฒฐํ์ง ์๊ณ ์์ฒด BuildContext๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ถ์ฅ๋์ง ์๋๋ค๋ ๊ฒ์ ์ดํดํฉ๋๋ค. ํด๋์ค ์์ ฏ์ด ํ๋ ๊ฒ์ฒ๋ผ ๊ฐ์ฒด ์๋์ ๋์ผํ ๊ฒ์ ์์ฑํ ์ ์๋ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ฉ์ปค๋์ฆ์ ๋์ ํ๋ ๊ฒ์ด ๋์์ด ๋ ๊น์?
@ivenxu ์ด๊ฒ์ ๋ค๋ฅธ ํจํค์ง์์๋ ๋ด๊ฐ ๋ง๋ ๊ฒ์ ๋๋ค. https://github.com/rrousselGit/functional_widget
ํจ์(ํค ๋ฐ ๋ชจ๋ ๊ฒ ํฌํจ)์์ ํด๋์ค๋ฅผ ์์ฑํ๊ณ HookWidget
๋ฅผ ์์ฑํ๋ ํํฌ์ ํธํ๋๋ ์ฝ๋ ์์ฑ๊ธฐ์
๋๋ค.
๋์ ํฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<strong i="11">@hwidget</strong>
Widget foo(BuildContext context, {Duration duration}) {
final controller = useAninationController(duration: duration);
useEffect(controller.forward, [controller]);
final value = useAnination(controller);
return Text(value.toString());
}
์ ์ง์ ์ผ๋ก 0์์ 1๋ก ๊ฐ๋ ๋ฉ์ง ํ
์คํธ๋ฅผ ๋ง๋ญ๋๋ค.
6์ค์ ์ฝ๋๋ก...
์ผ๋ฐ์ ์ธ ์์ ฏ์์๋ 30์ค ์ด์์ด ํ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ ์์ฑ๋ debugFillProperties
๋ฐ operator==
์ฌ์ ์๋ฅผ ๊ณ์ฐํ์ง ์์ต๋๋ค.
@rrousselGit ๊ธฐ๋ฅ์ ์์ ฏ์ ๋ํ ๊ทํ์ ์์ ์ ๋ํด ์๊ณ ์์๊ณ , ์ข์ ๋ด์ฉ๊ณผ ๊ฐ์ฌํฉ๋๋ค! ๊ทธ๋ฌ๋ ๋๋ flutter์ ๊ธฐ๋ณธ ์ง์์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค.
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ฒจ๋ถ๋ ๋๋ฒ๊ทธ๋ ์ฝ๋ ์์ฑ์ ์ด๋ป๊ฒ ๊ฐ๋์? foo()์์ ์ค๋จ์ ์ ์ค์ ํ๊ณ ์ง์ญ ๋ณ์๋ฅผ ๊ฒ์ฌํ ์ ์์ต๋๊น? ์ฝ์คํ์ ์ด๋ป๊ฒ ์๊ฒผ๋์?
๋๋ก๋ ์ปดํฌ๋ํธ/์์ ฏ์ ๋ํ ๊ธฐ๋ฅ์ ํจ๋ฌ๋ค์์ด ํด๋์ค์ ๋นํด ํจ์ฌ ๋ ๊ฐ๊ฒฐํฉ๋๋ค. ๊ทธ๋์ ๋ค์ดํฐ๋ธ ์ง์ ๊ธฐ๋ฅ ์์ ฏ์ด ์ด๋ค ์ฐจ์ด๋ฅผ ๋ง๋ค์ง ์ฌ๋ถ์ ๋ํ ์์ด๋์ด๋ฅผ ์ฐพ๊ณ ์์ต๋๋ค.
ํํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
์ ๋ ์ฌ๊ธฐ์ "before" ์ฌ์ง์ด "after" ์ฌ์ง๋ณด๋ค ํจ์ฌ ๋ ๋ช ํํ๊ณ ์ดํดํ๊ธฐ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฌผ๋ก ์ฃผ๊ด์ ์ธ ์๊ฐ์ด๊ธด ํ์ง๋ง์.
Flutter๊ฐ Widget ๊ธฐ๋ณธ ํด๋์ค๋ง ์ ๊ณตํ๊ณ StatefulWidget์ ์ธ๋ถ ์ข ์์ฑ์ผ๋ก ๋ง๋ ๊ฒฝ์ฐ์ ๊ฐ์ต๋๋ค. ์ด์น์ ๋ง์ง ์์ต๋๋ค.
๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ ์ค์ ๋ก Flutter์ ๊ณ์ธตํ ์ฒ ํ๊ณผ ๋งค์ฐ ์ผ์นํฉ๋๋ค. StatefulWidget์ ํ๋ ์์ํฌ์ ์์ ฏ ๋ ์ด์ด์ ํต์ฌ ์ผ๊ธ ๋ถ๋ถ์ผ๋ก ์ฌ์ฉํ๋ ์ฃผ๋ ์ด์ ๋ ํ๋ ์์ํฌ์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ด ์ฌ๊ธฐ์ ์์กดํ๊ธฐ ๋๋ฌธ์
๋๋ค(์: GlobalKey
). ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋ฅํ ํ ํต์ฌ์ ์์ง ์๋๋ก ๊ธฐ๋ฅ์ ์ถ์ถํ๊ณ ์ถ์ต๋๋ค.
์ฌ์ฉํ๊ณ ์ถ์ ๋ถ๋ค์ ์ํด ํจํค์ง๋ก ํด๋๋ ๊ฒ๋ ์๋ฏธ๊ฐ ์์ ๊ฒ ๊ฐ์์. ํต์ฌ ํ๋ ์์ํฌ์์ ๋ ๋์ ๊ตฌํ, ๋ ํจ์จ์ ์ธ ๊ตฌํ ๋ฑ์ ์ํด ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ผ์ด ์๋ค๋ฉด ๋ฐ๋์ ๊ทธ๋ ๊ฒ ํด์ผ ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ํ๋ฅญํ ํ๋ก์ ํธ๋ผ๊ณ ์๊ฐํ๊ณ ๊ด์ฌ์ ๊ฐ์ง๊ณ ํจํค์ง๋ฅผ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
์ฆ, ์ด๊ฒ์ด ํ๋ ์์ํฌ์ ์์ด์ผ ํ๋ ์ด์ ์ ๋ํด ์์ ํ ๋ช ํํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ด๋ค ์ฌ๋๋ค์ ์ข์ํ ๊ฒ์ด๊ณ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์ ํธํ ๋งค์ฐ ์ ์ฉํ ํจํด์ฒ๋ผ ๋ณด์ ๋๋ค.
@rrousselGit ๋๋ ๋น์ ์ด ์ด๊ฒ์ ๋ณ๋์ ํจํค์ง๋ก ๊ณ์ ๊ฐ๋ฐํ๊ณ ๊ทธ๊ฒ์ ๋ ์ฑ๊ณต์ ์ผ๋ก ๋ง๋๋ ๋ฐ ๋์์ด ๋ ํต์ฌ ํ๋ ์์ํฌ์ ๋ํ ๋ฌธ์ /PR์ ์ฌ๋ ๋ฐ ๋ง์ ์ฑ๊ณต์ ๊ฑฐ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ์ด ์์ ์ ์ํํ์ง ์๋ ํ๋ ์์ํฌ์์ ๋ ธ์ถํด์ผ ํ๋ ๊ฒ์ด ์์ผ๋ฉด ํด๊ฒฐํด ๋ณด๊ฒ ์ต๋๋ค. ํ๋ ์์ํฌ์ ์ด ์์ ์ ์ฐจ๋จํ๋ ๋ฒ๊ทธ๊ฐ ์์ผ๋ฉด ์๋ํ๋๋ก ํฉ์๋ค!
๊ทธ๋ฆฌ๊ณ FWIW, ๋๋ ์ด๊ฒ์ด flutter_svg์ ์ ์ฌํ ๊ฒฝํ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ๋งํฉ๋๋ค. ์ด๋ ํ๋ ์์ํฌ์ ์ฝ๊ฐ์ ๊ธฐ์ฌ๋ฅผ ํ๊ณ ๋ง์ ์ฌ๋๋ค์๊ฒ ํจํค์ง๋ก ์ ์ฉํ ์ ์์์ต๋๋ค.
๋ฐฉ๊ธ ๊นจ๋ฌ์์ต๋๋ค.
ํํฌ๊ฐ Flutter์์ ๊ตฌํ๋๋ค๋ฉด ์ข์ ํ๋ณด๋ ComponentElement์
๋๋ค.
์ฆ, ์ ์์ ฏ ์ ํ์ ์ฌ์ฉํ๋ ๋์ StatelessWidget๊ณผ StatefulWidget์ ํํฌ์ ํธํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ ๊ตฌ๋ฌธ์ด ๊ณต์กดํ ์ ์์ต๋๋ค. ๋ ๊ตฌ๋ฌธ ๋ชจ๋ ์ฅ๋จ์ ์ด ์๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ์ ์ฉํ ์ ์์ต๋๋ค.
์ง๊ธ์ Flutter ์ธ๋ถ์ ์๋ ํํฌ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ด ์ ์ผํ ๊ด์ฌ์ฌ๋ ๋น๊ณต์์ ์ด์ด์ ์ ์ฒด ํํฌ ์ฌ์ฉ๋์ด ์ค์ด๋ค ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ํ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ํํฌ ์๋ฅผ ์ค์ด์ญ์์ค.
ํํฌ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ์ปค๋ฎค๋ํฐ ์ํฅ(pub์ ๊ฒ์ ๊ฐ๋ฅํ ์ฌ์ฉ์ ์ ์ ํํฌ)์ด๋ผ๋ ์ ์ ๊ณ ๋ คํ๋ฉด ์ ์ฉ์ฑ์ด ๋จ์ด์ง๋๋ค.
Flutter ํ์ ๋๊ตฐ๊ฐ๊ฐ Hooks์ ๋ํด 1:1 ์ฑํ ์ ํ๊ณ ์ถ๋ค๋ฉด, ์ ๋ ์ฐ๋ฆฌ๊ฐ React์์ Hooks๋ฅผ ์ฑํํ ์ด์ ์ ๋ํ ์ญ์ฌ์ , ๊ธฐ์ ์ ๋งฅ๋ฝ์ ์ค๋ช ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ์ด ์๊ฒฌ๋ ํฅ๋ฏธ๋ก์ธ ์ ์์ต๋๋ค. https://github.com/reactjs/rfcs/pull/68#issuecomment -439314884.
@Hixie ๋๋ @dnfield ์ฌ๋ฌ๋ถ ์ค @gaearon์๊ฒ ์ฐ๋ฝํ ์ ์ด ์์ต๋๊น?
React๋ ๋ง์ด ์ฌ์ฉํ๋ Flutter ์ฌ์ฉ์๋ก์ ํํฌ๋ React์ ์ง์ ํ ๊ฒ์ ์ฒด์ธ์ ๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ์ ๋ ๋ ์ ์ ์ผ๋ก ํํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์์ผ๋ฉฐ ์์ ํ๋ฉด์ ๊ธฐ์กด ํด๋์ค๋ฅผ ํํฌ๋ก ์ด์ํ๊ณ ์์ต๋๋ค. ๊ตฌ์ฑ ์์์ ํน์ ๋ถ๋ถ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ์ฝ๋๋ฅผ ๊ฐ์ ์์น์ ๋๋ ๊ฒ์ ์ด์ ์ ๋๋์ต๋๋ค!
๊ทธ ํจ๋ฌ๋ค์์ด Flutter์ ๋ง๋์ง ํ๊ฐํ๋ ๋ ธ๋ ฅ์ด ์์๋ค๋ฉด ์ ๋ง ์ข์์ ๊ฒ ๊ฐ์์โค๏ธ
๋ด๊ฐ ๊ทธ ๋๊ธ์ ๋์ณค์ด! ๋๋ ๊ทธ๋ค์๊ฒ ์์ ๋ด๋ฐ์๋ค.
๋๋ Hooks๊ฐ Flutter์ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํ๋ค๋ ๊ฒ์ ์ธ์ ํด์ผ ํฉ๋๋ค. ์คํํ๊ณ ์ถ๋ค๋ฉด ์ด๋ฏธ Hooks ํจํค์ง๊ฐ ๋ช ๊ฐ ์์ต๋๋ค(์ผ๋ถ๋ ์์ ์ด ๋ฒ๊ทธ์์ ์ธ๊ธ๋จ). ๊ทผ๋ณธ์ ์ผ๋ก, ๋๋ ๊ทธ ๊ฐ๋ ์ด ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค.
๋ด ๊ด์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ด ์ด์ ์๊ฒฌ์ ์ฐธ์กฐํ์ญ์์ค. https://github.com/flutter/flutter/issues/25280#issuecomment -455846788, https://github.com/flutter/flutter/issues/25280#issuecomment - 455847134, https://github.com/flutter/flutter/issues/25280#issuecomment -456272076.
๊ทผ๋ณธ์ ์ผ๋ก, ๋๋ ๊ทธ ๊ฐ๋ ์ด ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค.
ํํฌ๋ ์ํ ๋ฏน์ค์ธ๊ณผ ๋น์ทํ์ง๋ง ๋ฏน์ค์ธ์ ๊ณ ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ณ์ ์ถฉ๋์ด ์๊ณ ๋ ๋ฒ ์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Hooks๋ Flutter๊ฐ ํ์ฌ ์ํ ์ ์ฅ ์์ ฏ์ ๋ํด ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ค ํ๋๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ฐ๋ก ์ด๋ฌํ ๋ชจ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
๊ฐ ์ปจํธ๋กค๋ฌ์๋ ๋์ผํ ๋ฐฉ์์ผ๋ก _ํญ์_ ๊ตฌํ๋๋ initState, didUpdateWidget ๋ฐ dispose๊ฐ ๋ชจ๋ ํ์ํฉ๋๋ค.
ํ๋ ์ด์์ด ํ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ํด๋์ค/๋ฏน์ค์ธ์ผ๋ก ์ถ์ถํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ๋์ ์ ๋ก์ง์ ๋ชจ๋ ๊ณณ์ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ์ด์ผ ํฉ๋๋ค.
ํ์ง๋ง ๊ทธ๊ฒ๋ ๋ณ๋ก ์ข์ง ์์ต๋๋ค. dispose
์ฌ์ ์์ ๊ฐ์ด ๋จ๊ณ๋ฅผ ์์ด๋ฒ๋ฆฌ๊ธฐ ์ฝ์ต๋๋ค.
ํํฌ์ ์ค์ ๋ฌธ์ ๋ ๊ตฌํํ๋ ๋ฐ ๋ง์ ์์ ์ด ํ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
ํต์ฌ ํ๋ ์์ํฌ๋ ๊ฐ๋จํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ณ ์ ํ ๋์์ผ๋ก ์ธํด ๋ฆฐํฐ ๋ฐ ๋ฆฌํฉํ ๋ง ๋๊ตฌ์์ ๊ธด๋ฐํ ํตํฉ์ด ํ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ต์ ์ ๊ตฌํ์ ์ํด ํํ/๊ตฌ์กฐ ๋ถํด์ ๊ฐ์ ์ผ๋ถ ์ธ์ด ๊ธฐ๋ฅ์ด ํ์ํ ์ ์์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ด๊ฐ ์์์ ๋งํ ์๊ฒฌ์ ์ค์ ๋ก ํด๊ฒฐํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค (https://github.com/flutter/flutter/issues/25280#issuecomment-455846788 ๋ฐ https://github.com/flutter/flutter/issues/25280# ํนํ issuecomment-456272076).
ํ , @gaearon ์ด ์๋ง ์ ๋ณด๋ค ๋ ์ ์ค๋ช ํ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ ๊ด์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ๋ ์ฑ ์ธ์๋ ์์ ฏ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ ํฐ ์์ ฏ์์ ํํฌ๋ ๋ชจ๋ ๊ด๋ จ ๋นํธ๊ฐ ์๋ช ์ฃผ๊ธฐ์ ๊ฑธ์ณ ๋ถ์ฐ๋๋ ๋์ ํจ๊ป ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก _๋_ ๋_ ์ฝ๊ธฐ ์ฌ์ด ๊ฒฝํฅ์ด ์์ต๋๋ค.
๋ฒ๊ทธ๊ฐ ์ ์ต๋๋ค. ๊ทธ๋ค์ ์ ์ธ์ API๋ ์ํ๋ฅผ ์ ๋ฐ์ดํธ/์ ๋ฆฌํ๋ ๊ฒ์ ์๋ ๊ฒ์ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค.
"์ ํต์ฌ์ด์ด์ผ ํฉ๋๊น?"์ ๋ํด Dan Abramov๊ฐ ์ฌ์ฉํ ๋น์ ๋ฅผ ์ข์ํฉ๋๋ค.
ํํฌ๋ ์ ์๊ฐ ์์์ ๋ํด ์์ ฏ์ ๋ํ ๊ฒ์
๋๋ค.
๋ ํฐ ๊ฒ์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ์์์ธ ๊ฒฝ์ฐ ์ ์ธํ๋ ๊ฒ์ ์ด์น์ ๋ง์ง ์์ต๋๋ค.
ํํฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ๋ง์ด ์๋๋๋ค. ์ ์ฒด ํ๋ ์์ํฌ๊ฐ ํํ์ ๋ฐ์ ์ ์์ต๋๋ค.
์ ๋๋ฉ์ด์
, ์์ ๋ฑ์ ๊ฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@Hixie , Hooks๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋์ต๋๊น, ์๋๋ฉด ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ํด Hooks๋ฅผ ์คํ๋ ๋์ํธ๋ก ์์ฑํ๊ณ ์์ต๋๊น? Flutter ํ์ ์๊ฐ ์ค ๋ช %๊ฐ ๊ณ ๊ฐ์ ์ํ ์ฑ ์์ฑ๊ณผ ํ๋ ์์ํฌ ์์ฑ์ ์์๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ณ ๊ฐ์ฉ ์ฑ์ ์์ฑํ๋ ์ฌ๋๋ค์ ํ๋ ์์ํฌ ๊ฐ๋ฐ์์ ์ฝ๊ฐ ๋ค๋ฅธ ๊ฐ๋์์ ์ด ์ง๋ฌธ์ ์ ๊ทผํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ๊ธฐ์กด ์๋ฃจ์ ๊ณผ ๋์ผํ ๊ธฐ์ค์ ์ถฉ์กฑํ๋ ๊ฒ์ด ์๋๋ผ ์ด๋ป๊ฒ ์ด๊ฒ์ด ๋๋ฅผ ๋ ํจ๊ณผ์ ์ผ๋ก ๋ง๋ค๊ณ ๊ณ ๊ฐ์๊ฒ ๋ ๋ง์ ๊ฐ์น๋ฅผ ์ ๊ณตํ ์ ์์ต๋๊น?
๋๋ ์ต๊ทผ์ ์ฐ๋ฆฌ์ ์๋ก์ด ์ธ๊ธฐ ์ฑ ์ค ํ๋์์ functional_widget๊ณผ ํจ๊ป flutter_hooks๋ฅผ ์๊ฐํ์ต๋๋ค.
์์ฉ๊ตฌ ์ฝ๋๋ฅผ ํฌ๊ฒ ์ค์์ผ๋ฉฐ ๋ชจ๋ ์ง์ ๋ถํ ์ํ ์ ์ฅ ์์ ฏ์ ํํฌ๊ฐ ์๋ ์์ ๊ธฐ๋ฅ์ผ๋ก ๋ฆฌํฉํ ๋งํ ํ ์ฝ๋๋ฒ ์ด์ค๊ฐ ์ฝ 70% ์ถ์๋์์ต๋๋ค.
๋ ๋์ ์์ค์์ ๋ณผ ๋ ํํฌ ์ธํธ๊ฐ ์๋ ๊ธฐ๋ฅ์ ์์ ฏ์ RX์์ CombineLatest๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ ๊ฒฐํฉํ๋ ํ์ ๋จ์ํ์ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์๋ฌธ์ ์๋ ๋ชจ๋ ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ์ ๋ช ์์ ์ผ๋ก ์ธ๊ธํ๊ณ ์ด์ ๋ํด ์๋ํ๋ ๊ธฐ๋ฅ์ ๊ฐ๋ ๋์ ํํฌ๋ ๊ฐ์ด ํ์ํ ์ฝ๋์ ์ฐ๊ฒฐํ๊ธฐ ๋๋ฌธ์ ํจ์ฌ ๋ ์ ์ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ฒฐ๊ตญ ์ด๋ฌํ ๊ฐ ์์ ฏ์ RX ์คํธ๋ฆผ์ ํ ๋จ๊ณ์ ๊ฐ์ต๋๋ค.
๋๋ ํ์คํ ์ฐ๋ฆฌ๊ฐ flutter_hooks๋ฅผ ์ ๊ฑฐํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ(Flutter ํ)๊ฐ ๋ ๊ฐ์น ์๋ ๊ฒ์ ์ ๊ณตํ ์ ์๋์ง ์์ง ๋ชปํฉ๋๋ค.
ํํฌ๋ ์ ์๊ฐ ์์์ ๋ํด ์์ ฏ์ ๋ํ ๊ฒ์ ๋๋ค.
์ ์๊ฐ์๋ Flutter๋ฅผ ์ฟผํฌ ๋๋ ํ๋๋ก ์ผ๋ก ๊ฐ์ฃผํด์ผ ํ๋ค๋ ์์ ๋ฅผ ๋ฐ๋ฅธ๋ค๊ณ ์๊ฐํฉ๋๋ค. Hooks์ ์ ์๋ ์์ ์ธต์ ๋๋ค.
@Hixie , Hooks๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ์๊ฐ์ ๋ณด๋์ต๋๊น, ์๋๋ฉด ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ํด Hooks๋ฅผ ์คํ๋ ๋์ํธ๋ก ์์ฑํ๊ณ ์์ต๋๊น? Flutter ํ์ ์๊ฐ ์ค ๋ช %๊ฐ ๊ณ ๊ฐ์ ์ํ ์ฑ ์์ฑ๊ณผ ํ๋ ์์ํฌ ์์ฑ์ ์์๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋๋ Hooks๋ฅผ ์ง์ ์ฌ์ฉํ์ง ์์์ต๋๋ค. Flutter๋ก ์ฑ์ ์์ฑํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ ๋ Hooks์ ๊ฐ์ ๊ฒ์ด ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์์ ์ธ๊ธํ๋ฏ์ด Hooks๊ฐ ๋ด ๊ฐ๋ฐ ์คํ์ผ๊ณผ ์ผ์นํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค(์ ๋ ์์ฉ๊ตฌ๋ฅผ ๋ณด๋ ๊ฒ์ ์ ํธํฉ๋๋ค). Hooks๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ฌ๋์๊ฒ์ Hooks๋ฅผ ์ ๊ฑฐํ๊ณ ์ถ์ง๋ ์์ ๊ฒ์ ๋๋ค.
๋๋ ์ฐ๋ฆฌ(Flutter ํ)๊ฐ ๋ ๊ฐ์น ์๋ ๊ฒ์ ์ ๊ณตํ ์ ์๋์ง ์์ง ๋ชปํฉ๋๋ค.
ํํฌ๋ฅผ ์ง์ ์ผ๋ก ์ ์ฉํ๊ฒ ๋ง๋ค๋ ค๋ฉด ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ๊ณผ ๋ง์ถคํ ๋ฆฌํฉํ ๋ง ์ต์
์ด ํ์ํฉ๋๋ค.
์ด๋ค๋ง์ด ํํฌ๊ฐ ์ง์ ์ผ๋ก ๋น๋ฉ๋๋ค.
ํํฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋ฐ์ ์ธ StatefulWidget์์๋ ๋ถ๊ฐ๋ฅํ ๋งค์ฐ ๊ฐ๋ ฅํ ์ ์ ๋ถ์์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์์ ฏ์ ๋ก์ปฌ ์ํ๋ฅผ ๋ ์์ ํ๊ณ ํ์ฅ์ฑ ์๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๋์๊ฒ ์์ฉ๊ตฌ ๊ฐ์๋ ๋ณด๋์ค์ผ ๋ฟ์
๋๋ค.
ํ์ง๋ง:
๋ฐ๋ผ์ ์ปค๋ฎค๋ํฐ์์ ์ ์ง ๊ด๋ฆฌํ๋ ํจํค์ง๋ก์ ํํฌ์ ๋ํ ์์ ํ ๋๊ตฌ๋ฅผ ๊ฐ์ง ํ๋ฅ ์ ๋งค์ฐ ๋ฎ์ต๋๋ค.
์ ์๊ฐ์๋ Flutter๋ฅผ ์ฟผํฌ ๋๋ ํ๋๋ก ์ผ๋ก ๊ฐ์ฃผํด์ผ ํ๋ค๋ ์์ ๋ฅผ ๋ฐ๋ฅธ๋ค๊ณ ์๊ฐํฉ๋๋ค. Hooks์ ์ ์๋ ์์ ์ธต์ ๋๋ค.
Flutter๊ฐ ์ฟผํฌ๋ผ๋ฉด ๊ทธ๊ฒ์ ์ํ์ด๊ธฐ๋ ํฉ๋๋ค.
์ค์ ๋ก Layer ์ ๊ฐ์ ๋งค์ฐ ๋ฎ์ ์์ค์ ํด๋์ค๊ฐ ์์ต๋๋ค.
๊ทธ๋ฌ๋ Switch ์ ๊ฐ์ ๊ณ ๊ธ ํด๋์ค๋ ์์ฒญ๋๊ฒ ๋ง์ต๋๋ค.
์ ์ฒด Material ๋ฐ Cupertino ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํจํค์ง๋ก ์ถ์ถ๋ ๋ค์ Navigator๋ก ์ถ์ถ๋์ด ๊ด๋ จ ๊ฐ์ฒด๋ฅผ ํ์ฑํ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๋ค์ ๊ทธ๋ ์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํํฌ๋ ์ด๊ฒ๋ค๋ณด๋ค ์๋์ ์๋ ๋ช ๊ฐ์ ๋ ์ด์ด์
๋๋ค.
๊ด๋ จ์ด ์์ง๋ง Material๊ณผ Cupertino๋ ์ด์ ์์ค ๊ตฌ์ฑ์์์ Material ๊ณ ๊ธ ๊ตฌ์ฑ์์ ์ฌ์ด์ ์ข์ ์ธํฐํ์ด์ค๊ฐ ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ํต์ฌ Flutter ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋์ด์๋ ์ ๋๋ค๊ณ ๊ฐ๋ ฅํ ๋ฏฟ์ต๋๋ค. Material ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด ์ฑ์ ๋ง๋ค์ด ๋ณธ ์ ์ด ์๋ค๋ฉด ์์ฒญ๋๊ฒ ์ด๋ ต์ต๋๋ค.
ํํฌ๋ ์ค์ ๋ก ์์ฉ๊ตฌ๋ฅผ ์ค์ด๋ ๊ฒ๋งํผ ์ค์ํ ๊ฒ์ด ์๋๋๋ค. (์ฐ๋ฆฌ๋ ์์ฉ๊ตฌ๋ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค.) ๋์๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ฐ์น๋ ์ํ ์ ์ฅ ๋ ผ๋ฆฌ๋ฅผ ์บก์ํํ๊ณ ๊ตฌ์ฑํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
const [value, setValue] = useState(0)
const debouncedValue = useDebounced(value, 1000)
const interpolatedValue = useSpring(debouncedValue, {
friction: 10,
mass: 20
})
์ํ๊ฐ ํฌํจ๋์ด ์๋์ง ์ฌ๋ถ์ ๋ํด ๊ฑฑ์ ํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ํ์ดํํ ์ ์๊ณ ์ด ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉ์ ์ ์ Hook์ผ๋ก ์ถ์ถํ๊ฑฐ๋ ๋์ผํ Hook์ ์ฌ๋ฌ ๋ฒ ์ ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋งค์ฐ ํํ๋ ฅ์ด ๋ฐ์ด๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Rx์ ๊ฐ์ ์ ๊ทผ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ ์ค์ ๋ก ๊ฒฐํฉ์๋ฅผ ์ดํด๋ณด์ง ์๊ณ ๋ ๋ชจ๋ ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ์คํํ ์ ์์ต๋๋ค.
ํํฌ๋ฅผ ์ง์ ์ผ๋ก ์ ์ฉํ๊ฒ ๋ง๋ค๋ ค๋ฉด ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ๊ณผ ๋ง์ถคํ ๋ฆฌํฉํ ๋ง ์ต์ ์ด ํ์ํฉ๋๋ค.
์ด๋ค๋ง์ด ํํฌ๊ฐ ์ง์ ์ผ๋ก ๋น๋ฉ๋๋ค.
์ด๋ฅผ ์ง์ํด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ํ์ง๋ง ๊ทธ๊ฒ์ Dart GitHub ํ๋ก์ ํธ์ ๋ํด ์ ๊ธฐ๋ ๋ฒ๊ทธ์ฌ์ผ ํฉ๋๋ค. ํ์คํ Dart ์ฝ๋๋ฒ ์ด์ค์์ Flutter ๊ด๋ จ ๋ฆฐํธ๋ฅผ ์ฎ๊ธฐ๊ณ ์ถ์ต๋๋ค.
์ ์ฒด Material ๋ฐ Cupertino ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํจํค์ง๋ก ์ถ์ถ๋ ๋ค์ Navigator๋ก ์ถ์ถ๋์ด ๊ด๋ จ ๊ฐ์ฒด๋ฅผ ํ์ฑํ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ทธ๋ค์ ๊ทธ๋ ์ง ์์ต๋๋ค.
์, ์๋ง๋ ์ฌ์ค์ด๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๋ ๊ฒ ํ์ง ์๋ ์ค์ง์ ์ธ ์ด์ ๊ฐ ์์ต๋๋ค(์: "Hello World"๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ค์ด Flutter ์ฌ์ฉ์ ์์ํ๊ธฐ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์). ํ์ง๋ง ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ณ ๋ คํ ์๋ ์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง, ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๊ณ ๋ คํ๊ณ ์ถ๋ค๋ฉด ๋ณ๋๋ก ์ ๊ธฐํด์ผ ํ๋ ๋ณ๋์ ๋ฌธ์ ์ ๋๋ค.
๋์๊ฒ ๊ฐ์ฅ ์ค์ํ ๊ฐ์น๋ ์ํ ์ ์ฅ ๋ ผ๋ฆฌ๋ฅผ ์บก์ํํ๊ณ ๊ตฌ์ฑํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๊ฒ์ ์ฐธ์ผ๋ก ๋งค์ฐ ๊ฐ์น ์๋ ์ผ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ํต์ฌ ํ๋ ์์ํฌ์ ์์ด์ผ ํ๋์ง๋ ๋ถ๋ช ํ์ง ์์ต๋๋ค.
๊ทธ๊ฒ์ ์ฐธ์ผ๋ก ๋งค์ฐ ๊ฐ์น ์๋ ์ผ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ํต์ฌ ํ๋ ์์ํฌ์ ์์ด์ผ ํ๋์ง๋ ๋ถ๋ช ํ์ง ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ผ๋ถ ํต์ฌ State ๋ฏน์ค์ธ์ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด AutomaticKeepAliveClientMixin
๋ ์ด์ํ ์์น์ ์์ต๋๋ค.
super.build
๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค. ์ด๋ ๋งค์ฐ ์ง๊ด์ ์ด์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ super.build
๋ nullable์ด ์๋ ์ ํ์์๋ ์๋ํ์ง ์๋ null
๋ฅผ ๋ฐํํฉ๋๋ค.
๊ทธ๋ฌ๋ ํํฌ๋ก์ ์ด ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ชจ๋ ํด๊ฒฐ๋ฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ํํฌ๋ ์ํ๋ ๋งํผ ์ฌ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก SingleTickerProviderStateMixin
๋ฐ TickerProviderStateMixin
๋ ๋ค ํ์ํ์ง ์์ต๋๋ค.
๋๋ ํํฌ์๋ ์ค์ํ ์ปค๋ฎค๋ํฐ ์ธก๋ฉด์ด ์์ต๋๋ค. ํต์ฌ์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ง์ ํํฌ๋ฅผ ๋ง๋ค๊ณ ๊ณต์ ํ ๊ฐ๋ฅ์ฑ์ด ํจ์ฌ ์ ์ต๋๋ค.
IMHO๊ฐ ๊ฐ๋ ์ฑ์ ๋จ์ด๋จ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ค์ ๋ก ํต์ฌ ํ๋ ์์ํฌ์์ ํํฌ๋ฅผ _์ฌ์ฉ_ํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ํต์ฌ ํ๋ ์์ํฌ์ ํฌํจํ๋ฉด ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค.
๋๋ ํํฌ์๋ ์ค์ํ ์ปค๋ฎค๋ํฐ ์ธก๋ฉด์ด ์์ต๋๋ค. ํต์ฌ์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ง์ ํํฌ๋ฅผ ๋ง๋ค๊ณ ๊ณต์ ํ ๊ฐ๋ฅ์ฑ์ด ํจ์ฌ ์ ์ต๋๋ค.
ํํฌ๊ฐ ์ข๋ค๋ฉด ์ฌ๋๋ค์ ๊ทธ๋ค์ด Flutter ์คํ ์์ค ํ๋ก์ ํธ์์ ์๋์ง ์๋๋ฉด Hooks ์คํ ์์ค ํ๋ก์ ํธ์์ ์๋์ง์ ์๊ด์์ด ๊ทธ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
IMHO๊ฐ ๊ฐ๋ ์ฑ์ ๋จ์ด๋จ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ค์ ๋ก ํต์ฌ ํ๋ ์์ํฌ์์ ํํฌ๋ฅผ _์ฌ์ฉ_ํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ํต์ฌ ํ๋ ์์ํฌ์ ํฌํจํ๋ฉด ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค.
๋๋ ํํฌ์๋ ์ค์ํ ์ปค๋ฎค๋ํฐ ์ธก๋ฉด์ด ์์ต๋๋ค. ํต์ฌ์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ง์ ํํฌ๋ฅผ ๋ง๋ค๊ณ ๊ณต์ ํ ๊ฐ๋ฅ์ฑ์ด ํจ์ฌ ์ ์ต๋๋ค.
ํํฌ๊ฐ ์ข๋ค๋ฉด ์ฌ๋๋ค์ ๊ทธ๋ค์ด Flutter ์คํ ์์ค ํ๋ก์ ํธ์์ ์๋์ง ์๋๋ฉด Hooks ์คํ ์์ค ํ๋ก์ ํธ์์ ์๋์ง์ ์๊ด์์ด ๊ทธ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
๋์ ์๊ฐ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Hooks๋ ๋ณ๋์ ์คํ ์์ค ํ๋ก์ ํธ๋ก ์คํํ ์ ์์ต๋๋ค. ํต์ฌ ํ์ hook ํ๋ก์ ํธ์ ํต์ฌ ๋ณ๊ฒฝ ์๊ตฌ ์ฌํญ์ ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๊น? IMHO hook ํ๋ก์ ํธ์ ์ฑ๊ณต์ ์ํด์๋ ์๋นํ ์ค์ํฉ๋๋ค.
"ํต์ฌ ๋ณ๊ฒฝ ์๊ตฌ ์ฌํญ"์ด๋ ๋ฌด์์ ๋๊น?
"ํต์ฌ ๋ณ๊ฒฝ ์๊ตฌ ์ฌํญ"์ด๋ ๋ฌด์์ ๋๊น?
๋ฐ๋ธํด์ฆ.
์ฃผ๋ก ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ์ ๊ดํ ๊ฒ์ด์ง๋ง ์ ์ฌ์ ์ผ๋ก flutter/devtools์ ํ๋ฌ๊ทธ์ธ ์์คํ
์ ๊ดํ ๊ฒ์
๋๋ค.
๊ฑฐ๊ธฐ์๋ ์ปค๋ฎค๋ํฐ์์ ํ ์ ์๋ ๋ง์ ์์ ์ด ํฌํจ๋์ด ์์ต๋๋ค.
IMHO๊ฐ ๊ฐ๋ ์ฑ์ ๋จ์ด๋จ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ค์ ๋ก ํต์ฌ ํ๋ ์์ํฌ์์ ํํฌ๋ฅผ _์ฌ์ฉ_ํ์ง ์์ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ํต์ฌ ํ๋ ์์ํฌ์ ํฌํจํ๋ฉด ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค.
๋ชจ๋ ์กด๊ฒฝ์ฌ์ ๊ฐ์ง๊ณ ์์ง๋ง ์ด๊ฒ์ ์ฝ๊ฐ ๋ฌด์งํ๊ฒ ๋ค๋ฆฝ๋๋ค. ๋น์ ์ ์ ๋ง๋ก ๊ทธ๋ค์๊ฒ ์๋ํด์ผํฉ๋๋ค! ์ํ์ ๊ฐ ๋จ์ผ ์ธก๋ฉด์ ๋ํด initState/dispose/setState/build๋ฅผ ์ฌ์ฉํ์ฌ ์ถค์ ์ถ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๊ฒฐํฉ๋๋ค.
Flutter๋ ๊ตฌ์ฑ์ ๊ดํ ๋ชจ๋ ๊ฒ์ด๋ฉฐ ํํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์์ฐ์ค๋ฝ๊ฒ ๊ตฌ์ฑ ํจํด์ ๋ฐ๋ฅด๋ ๋ฐ๋ฉด์ mixin์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ตฌ์ฑ์ ๋ฐ๋์ ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ๋ถ์๊ธฐ๋ฅผ ๋์ ์ฐ์ ์์๋ก ํ์ฅ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ๊ฒ์ ๊ณ์ ๊ณ ๋ คํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ถํํ๋, ๊ธฐ๋ณธ์ ์ธ ์ฒซ ์๊ฐ ์์ ์ ๋ํ ๊ฒฝํ ๊ฐ์ ๋ฐ ๊ธฐ๋ณธ์ ์ผ๋ก nullable์ด ์๋ ๋ณ๊ฒฝ์ ์ํ ๋๊ตฌ ๊ตฌํ๊ณผ ๊ฐ์ ๋ ๋์ ์ฐ์ ์์๊ฐ ๋ง์ด ์์ต๋๋ค.
๊ทธ๋ ๊ธด ํ์ง๋ง Google ์ง์์ด ์๋ ์ฌ๋์ ์ ์ด ์์ ์ ์ํํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. Flutter์ Dart๋ ๋ชจ๋ ์คํ ์์ค ํ๋ก์ ํธ์ด๋ฉฐ ๋ง์ ๊ฒ๋ค์ด Google ์ง์์ด ์๋ ์ฌ๋๋ค์ ์ํด ๊ตฌํ๋ฉ๋๋ค.
๊ทธ๋ ๊ธด ํ์ง๋ง Google ์ง์์ด ์๋ ์ฌ๋์ ์ ์ด ์์ ์ ์ํํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. Flutter์ Dart๋ ๋ชจ๋ ์คํ ์์ค ํ๋ก์ ํธ์ด๋ฉฐ ๋ง์ ๊ฒ๋ค์ด Google ์ง์์ด ์๋ ์ฌ๋๋ค์ ์ํด ๊ตฌํ๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ ํ์ด "๋ฎ์ ์ฐ์ ์์ ๊ธฐ๋ฅ"์ผ๋ก ๊ฐ์ฃผํ๊ณ ๋ง์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ํฌํจํ์ฌ ์ฌ๋ฌ ํ๋ก์ ํธ์์ ๋ช ๋ฌ ๋์ ์์ ํ๋ ๊ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ํฅ์ ๋ฐ๋ ํ๋ก์ ํธ๋ ๊ณต๊ฐ ๋ฌธ์๊ฐ ๊ฑฐ์ ์๋ ๋งค์ฐ ๋ฎ์ ์์ค์ ๋๋ค.
ํ์ํ ํฌ์์ ๊ฑฐ์ ์ ์ํ์ด / ์ค๊ฐ์ ๊ฐํ ์ํ์ด ๋๋ฌด ๋์ต๋๋ค. ํนํ ์ฐ๋ฆฌ๊ฐ ๋์ ๋ฒ์ง ๋ชปํ ๋.
๊ทธ๋์ ๋ด๊ฐ ๋น์ ์ ์์ ์ ์ดํดํ๋ ๋์, ๊ทธ๊ฒ์ ๊ทนํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ต๋๋ค
์ด์ ๋ํ ๋ก๋๋งต์ด ์์ต๋๊น? ํํฌ๊ฐ ํ๋ฌํฐ์ ๋จ์ด์ง ์ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ์ธ์ ๊ฐ๋ฅํ์ง ์๊ณ ์์ต๋๊น?
Flutter๊ฐ 1๋ ์์ ์ฑ๊ณตํ๋ฉด(๋๋ ๊ทธ๋ ๊ฒ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค) Flutter์ ์จ๋ณด๋ฉํ๋ ค๋ ๋ชจ๋ React ๊ฐ๋ฐ์๋ ์ฌ๊ธฐ์ ํํฌ์ ๋ํ ์ผ๊ธ ์ง์์ด ์๋ค๋ ๊ฒ์ ์์์ ๋ ๋น๋ช ์ ์ง๋ฅด๊ฒ ๋ ๊ฒ์ ๋๋ค.
Flutter ํ์ ํด๋์ค ๊ธฐ๋ฐ React ๋ชจ๋ธ์ ๋ณต์ฌํ๋ ์ข์ ๊ฒฐ์ ์ ๋ด๋ ธ์ง๋ง ๊ทธ๊ฒ์ ์ด์ ๊ณผ๊ฑฐ์ ์ผ์ด๊ณ ๊ธฐ๋ฅ์ ๊ตฌ์ฑ ์์์ ํํฌ๋ ๋ฏธ๋์ ๋๋ค. Flutter ํ์ด ๋๋ฑํ๊ฒ ์ ์งํ๋ ค๋ฉด ์ด ์๋ก์ด ํ์ค์ ๊นจ์ด๋์ผ ํฉ๋๋ค .
cgarciae๊ฐ ์ธ๊ธํ๋ฏ์ด React ์ปค๋ฎค๋ํฐ๋ ์์ผ๋ก ํํฌ ๋ฐ ๊ธฐ๋ฅ ๊ตฌ์ฑ ์์๋ก ์ด๋ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ๊ณผ ์์ฐ์ฑ์ด ๋ค๋ฅธ ํฌ๋ก์ค ํ๋ซํผ ๊ฐ๋ฐ ์๋ฃจ์ ๊ณผ ๋๋ฑํ์ง ์๊ธฐ ๋๋ฌธ์ Flutter๊ฐ ๊ตฌ์์ผ๋ก ๋ณด์ ๋๋ค.
์ต๊ทผ์ ๋ฐ์๊ณผ ํ๋ฌํฐ๋ฅผ ๋ชจ๋ ์ฌ์ฉํด ๋ณธ ๊ฒฐ๊ณผ, ํ๋ฌํฐ์ ํํฌ ๋๋ฝ์ ์์ฐ์ฑ, ์ผ๊ด์ฑ ๋ฐ ์ ์ง ๊ด๋ฆฌ ์ธก๋ฉด์์ ๋น๊ต ๋์ ์ํํธ์ ํฐ ๊ตฌ๋ฉ์ ๋จ๊น๋๋ค. ์กฐ์ง์ด ์ ํ๋ก์ ํธ์์ flutter๋ฅผ ์ฑํํ๊ฑฐ๋ ์ฌ๋๋ค์ด React ๊ธฐ๋ฐ ์๋ฃจ์ ์์ ๋ ธ๋ ฅํ ๊ฐ์น๊ฐ ์๋ flutter๋ก ์ ํํ๋๋ก ์ค๋ํ๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค.
๋๋ ๋๊ตฐ๊ฐ๊ฐ ๋๊ตฌ ์ธํธ, ์ ์์ค ํ๋ ์์ํฌ ๊ตฌํ, ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด ๋ณ๋ก ๋ฌธ์ ๊ฐ ๋์ง ์์ ์ ์๋ค๋ ๊ฒ์ ์์ ํ ์ดํดํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฑ ๊ฐ๋ฐ์๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ์๋์ํค๊ธฐ ์ํด "๋ถํ์ํ" ์์ฉ๊ตฌ๋ฅผ ๋ง์ด ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ ๊ทธ ํจ๊ณผ๋ ๋ฐ๋์งํ์ง ์์ต๋๋ค.
์ฌ๋๋ค์ด ํน์ ๋ฌธ์ ๋ฅผ ๋ณด๋ ๊ฐ๋์ ๋ฐ๋ผ ์ ์ถฉ/๊ท ํ์ด ๋ค๋ฅด๊ฒ ๋ณด์ผ ์ ์์ต๋๋ค. ์ ์ ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ์ง ์๊ฑฐ๋ ํน์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ผ๋ฉด ํ๋ ์์ํฌ ๋ด๋ถ ๊ตฌํ์ด ๋ ๊น๋ํด ๋ณด์ผ ์ ์์ง๋ง ํ๋ ์์ํฌ ์๋น์์ ์ฑ ์์ ๋์ด์ฃผ๊ณ ํด๋ผ์ด์ธํธ ์ธก ๊ตฌํ์ ํ์ํ ๊ฒ๋ณด๋ค ๋ ๋ณต์กํ๊ณ ์ํฌ๋ฅด๊ฒ ๋ง๋ค๋ฉฐ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ๊ณตํ๋ ์ ์์ ๋์์ด ๋์ง ์์ต๋๋ค. ๋ผ๋. ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์๊ฒ๋ ์์ฐ์ฑ๊ณผ ์ผ๊ด์ฑ์ด ์ค์ํ๋ฉฐ, ํ์ํฌ์ ์ปค๋ฎค๋ํฐ๋ฅผ ์ํด ํตํฉ ์ ๊ทผ ๋ฐฉ์/ํ์ค์ด ์ค์ํฉ๋๋ค. ์ ์ฒด์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ํญ์ ์ฌ๋๋ค์ด ์ธํ๋ฆฌ ๋ฐ๋ํธ์ ์ด๊ณ ์๋ค๋ ์ ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
ํํฌ๋ ๊ตฌํํ๊ธฐ ์ฌ์์ผ ํ์ง๋ง ๊ธฐ๋ฅ์ ์์ ฏ์ ๋ ์ด๋ ต์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ํํํด์ผ ํ๊ธฐ ๋๋ฌธ์ Dart์์ ๊ณต์ฉ์ฒด ์ ํ์ด ํ์ํฉ๋๋ค.
'์์ ฏ | ์์ ฏ ๊ธฐ๋ฅ(BuildContext)'.
๊ธฐ๋ฅ์ ์์ ฏ์ ๋ ์ด๋ ต์ต๋๋ค. Dart์์ ๊ณต์ฉ์ฒด ์ ํ์ด ํ์ํฉ๋๋ค.
๊ทธ๊ฒ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
์ฌ์ ํ ๋ค์๊ณผ ๊ฐ์ ์ง๋ฌธ์ด ์์ต๋๋ค.
debugFillProperties
๋ฉ์๋)๋๋ ๊ฝค ์ค๋ซ๋์ ๊ทธ๊ฒ์ ๋ํด ์๊ฐํด ์๋ค. ๊ธฐ๋ฅ์ ์์ ฏ์ ๋ํ ์ฌ์ด ์๋ฃจ์
์ด ๋ณด์ด์ง ์์ต๋๋ค.
๋ด๊ฐ ์๊ฐํ ์ ์๋ ์ ์ผํ ๊ฒ์ ์ฝ๋ ์์ฑ ๋ฐ ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ์ ์กฐํฉ(์ ์ ํ ์ ์๋ก ์ด๋ํ๊ธฐ ์ํ ๊ฒ)์
๋๋ค.
์ฌ์ค, ์ฝ๋ ์์ฑ ๋ถ๋ถ์ ์ฐ๋ฆฌ๋ก ํ์ฌ๊ธ ๋น์ ์ functional_widget ํจํค์ง์์ ๋น ์ง๊ฒ ๋ง๋ค์์ต๋๋ค. ์ฝ๋๋ฅผ ๊ฒํ ํ ๋ ๋๋ฌด ๋ง์ ์ ํ๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ๋ ์ง ์์ ๊ฒ์ ๋๋ค ...
์ฝ๋๋ฅผ ๊ฒํ ํ ๋ ๋๋ฌด ๋ง์ ์ ํ๋ฅผ ์์ฑํฉ๋๋ค.
๋ฐ๋ผ์ ๋ด๊ฐ ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ์ ์ธ๊ธํ ์ด์ ์ ๋๋ค.
์ฌ์ฉ์ ์ ์ ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ "ํํฌ์๋ ์ ์ ํ ๋ถ์๊ธฐ ํ๋ฌ๊ทธ์ธ ์์คํ
์ด ํ์ํฉ๋๋ค"๋ก ๋์๊ฐ๊ฒ ์ต๋๋ค.
functional
์์ ฏ์ ๋์
ํ ํ์๊ฐ ์์ ์๋ ์์ต๋๋ค.
ํํฌ ์ฌ์ฉ์ด StatelessWidget
build
๋ฉ์๋ ๋ด์์๋ง ํ์ฉ๋๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๊ธฐ์ ์ ์ธ ๊ด์ ์์ - ๊ทธ๊ฒ์ด ํด๋์ค์ธ์ง ํจ์์ธ์ง๋ (์ง๊ธ ๋ด๊ฐ ์๊ฐํ ์ ์๋ ํ) ๋ณ๋ก ์ค์ํ์ง ์์ต๋๋ค. ์ค์ํ ๋ถ๋ถ์ ์ํ ์ ์ฅ ํด๋์ค์ ํํฌ๋ฅผ ํผํฉํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ํ๋ ์๋์์ flutter ๋ ๋๋ฌ๋ build
๋ฉ์๋ ๋ด์์ ํธ์ถ๋๊ณ ์ ์ ํ๊ฒ ๊ด๋ฆฌ๋๋ ๊ฒฝ์ฐ ํํฌ์ ํด๋น ์์๋ฅผ ๊ณ์ ๊ณ์ฐํ ์ ์์ต๋๋ค.
๋ฏธ๋์ ๊ธฐ๋ฅ์ ์์ ฏ์ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ๊นจ๋ ๊ฒ์ด ์๋๋๋ค. ๋ํ ๊ธฐ์กด ์ฑ์ ์์์ํค์ง ์๊ธฐ ๋๋ฌธ์ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋ฉ๋๋ค.
StatelessWidget
๋ด๋ถ์ ํํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ด๋ จํ์ฌ ๊ตฌ์ฑ๊ณผ ๊ฐ์ ํํฌ ์ฌ์ฉ์ ์ด์ ์ ์์ ๋ ๋ช
๋ฐฑํ ๋ฌธ์ ๋ ๋ณด์ด์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด์จ๋ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๋ฅ๋ ฅ๊ณผ ๋น๊ตํ์ฌ ๋ฐ์์ useCallback
๋ฑ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ๋น๊ตํ๋ฉด ํ์คํ์ง ์์ต๋๋ค.
"React ๊ฐ๋ฐ์๊ฐ ํ๋ฅผ ๋ผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค" ์ธ์๊ฐ ์ ํจํ์ง ์์ต๋๋ค. (500๊ฐ ์ด์์ ์ฃผ์ JSX ํ ๋ก ์ฐธ์กฐ).
Flutter๋ Flutter์ด๋ฉฐ ๊ณ ์ ํ ์ธ์ด์ ๋์์ธ ํจํด์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
React ๊ฐ๋ฐ์์๊ฒ ๋ ์น์ํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ํ๋ ์์ํฌ์ ํญ๋ชฉ์ ์ถ๊ฐํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ํจํค์ง๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ ๋ก ์ ์ฝ์๊ณ Flutter ํ๋ ์์ํฌ ๊ฐ๋ฐ์์ธ @Hixie ๋ ๋ฌธ์ ์ ์ธก๋ฉด(๊ตฌํ ๋ฐ ... ํญ๋ชฉ)์ ๋ณด์๊ณ Flutter ์ฑ ๊ฐ๋ฐ์(๊ทธ์ ๋์ ๊ณ ๊ฐ)๊ฐ ์๊ฐํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋ํ ๊ด์ ์ด ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ค์ ๋ฐ์ .
๋๋ ์๋๋ก์ด๋ ๊ฐ๋ฐ์๋ก์ ๊ทธ๋ฐ ๋ฌธ์ ๊ฐ ์์๊ณ , ๋ด ์ฑ ์ฌ์ฉ์๊ฐ ๋ด ์ถํ UI์ ์ดํดํ๊ธฐ ์ด๋ ค์ด UX๋ฅผ ๋ณผ ๋ ์ด๋ป๊ฒ ๊ฒฝํํ ๊ฒ์ธ์ง ์ ํ ๋ชจ๋ฅด๋ ์ํ์์ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ํ๋ฅญํ ๋ฐฑ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋ฐํ๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค.
๋ค๋ฅธ ์ฌ๋์ด ์ ์ ๋งํ๋ฏ์ด ํํฌ๋ ํ๋ฅญํฉ๋๋ค. ๋๊ฐ ๊ทธ๊ฒ์ ์๊ฐํ๋ ์๊ด์์ด ์ฌ์
ํ FB ๋๋ Apple์
๋๋ค.
๊ทธ๋ฅ ์๋ํฉ๋๋ค. ์ํ ๋
ผ๋ฆฌ์ ํด๋น ์๋ช
์ฃผ๊ธฐ๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๊ฒ ์์ ์ ์ฉํ ๋ค๋ฅธ ํํฌ๋ฅผ ๋ง๋ค๊ณ , ์ฑ ์ํ์์ ๋
๋ฆฝ์ ์ธ ์์ ฏ, API, ๋๊ตฌ๋ฅผ ๊ฒ์ํ๊ณ , ๋ค๋ฅธ ํ๋ก์ ํธ์์ ๋ฏธ๋ฆฌ ์ ์๋ ๊ฒ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ pubspec.yaml
์ ๋ฏธ๋ฆฌ import material์ด๋ cupertino๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๊ฐ๋จํ hello-word ์ฑ์ ๋ง๋๋ ๊ฒ์ด ์ด๋ ต๋ค๋ฉด!!! ์ฌ๊ธฐ์์๋ ๋
ผ์ํ ๊ฒ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ StatefullWidget
๋ Flutter ์ํ๊ณ์ ๋งค์ฐ ์ค์ํ๋ฏ๋ก hook๊ณผ ๊ด๋ จ์ฑ์ Flutter์ ๋ฏธ๋์ ์ํ๊ณ ๋ฐ Flutter ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์ ๋ ์ค์ํฉ๋๋ค.
์ด๋ป๊ฒ ํ๋ฌํฐ ์ฑ ๊ฐ๋ฐ์ด ๋ ๊ฐ๋จํ๊ณ , ๋ฒ๊ทธ๊ฐ ์์ผ๋ฉฐ, ์ดํดํ๊ธฐ ์ฝ๊ณ , ํ์ฅ ๊ฐ๋ฅํ๊ณ , ์ฝ๊ธฐ ์ฝ๊ณ , ๋๋ฒ๊ทธ ๊ฐ๋ฅํ๊ณ , ์ด์ ๊ฐ๋ฅํ๋ฉฐ, ์ฝ์ด(๋๋ ๋ฌด์ธ๊ฐ)๋ก ์ง์ ์ง์๋๋ ํํฌ๋ฅผ ์ฌ์ฉํ์ฌ ... ํต์ฌ๊ณผ ์ฌ๋ฃ์ ๊ฐ์ ์ผ๋ถ ๋ณต์กํ ์์ ฏ ์ฌ์ด์ ์ค๊ฐ์ ์์ต๋๋ค. ...) ํน๋ณํ ๊ณต์์ ์ ๋๋ค.
๋ด ์์ ์ ๋ ์ ์ดํดํ๋ ค๋ฉด Java ๋ฐ ์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ Android ๊ฐ๋ฐ์ด ์ผ๋ง๋ ๋์ฐํ๋์ง, Kotlin์์ ์ผ๋ง๋ ๋ฉ์ง๊ณ ๋ฌ์ฝคํ์ง ์ดํด๋ณด์ธ์.
Coroutines, Flow, AndroidX + Kotlin ์ง์, ์๋ก์ด UI ์์คํ
(Compose)๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ข์ ๊ฒ๋ค๋ ๊ฐ๋ฅํฉ๋๋ค.
์ฌ์ง์ด ์๋ฐ ์ปค๋ฎค๋ํฐ๊ฐ ์์ฝ์์ kotlin futures๋ฅผ ์์ํ๊ณ ๊ตฌํํ๋๋ก ํ์ต๋๋ค.
๊ทธ๋์ pls๋ ํํฌ์ ๋ชจ๋ ๋ฒํผ๋ฅผ ์ญ์ ํ๊ณ ๋ฐ์ํ๊ณ ๊ทธ๋ฅ ํฉ๋๋ค.
๊ณต์ ํํฌ ์ง์์ ๋ถ์กฑ์ ๋ด๊ฐ ๋ฐ์ ๋ค์ดํฐ๋ธ์์ ์ ํํ์ง ์์ ์ ์ผํ ์ด์ ์ ๋๋ค.
ํํฌ๋ ์ถ์ ๋๋ฌด ์ฝ๊ฒ ๋ง๋ค์ด ๋ค์๋ ์์ ๋ฐฉ์์ผ๋ก ์ฐ๊ณ ์ถ์ง ์์ต๋๋ค.
"๋ค์ดํฐ๋ธ ํํฌ"์ ๋๋ผ์ด ๋ถ๋ถ์ ๋ง์ ๋ด๋ถ StatefulWidget ๋๋ ...์ ์ด ๊ฐ๋จํ๊ณ ์ดํดํ ์ ์๋ ํ์์ผ๋ก ์ด์ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
๋ํ Flutter ํ์ Flutter์ Dart๊ฐ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ์ดํดํ๊ธฐ ์ฝ๊ณ , ๋น ๋ฅด๊ฒ ๋ฐฐ์ธ ์ ์๋๋ก ๋ง๋ค์์ต๋๋ค. Native Hooks๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ชจ๋ ๊ฒ์ด ์ฌ์ค์ด๊ณ ๋ ๋์์ง ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ (initState/dispose/setState/build) ๋ฐฉ๋ฒ์ ์ด ๊ฒฝ๋ก์ ์์ต๋๋ค. (ํ๋ซํผ์ ๋ฐฑ์๋์์๋ ํ์ํ ์ ์์ง๋ง ์๋ก์ด ๊ฐ๋ฐ์๋ ์ฌ์ง์ด ์์ ์ ์์ด๋์ด๋ฅผ ์ค๋ช
ํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ค๋ ๋์์ด๋์๊ฒ๋ ํ์ํ์ง ์์ ์ ์์ต๋๋ค(๋ณต์กํ ๋
ผ๋ฆฌ๊ฐ ์๋)).
์ด ์ค๋ ๋์์ ์ฝ์ ๋ด์ฉ์ ๋ง์ ์ฌ๋๋ค์ด Flutter์์ ํํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ํฅ๋ฏธ๋ฅผ ๋๋ผ๊ณ ์์ผ๋ฉฐ ํํฌ์ ๋ํ ๋ช ๊ฐ์ง ๊ณต๊ฐ ์ง๋ฌธ์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด ๋ชจ๋ ์ง๋ฌธ์ ํด๊ฒฐํ ์ ์๋ค๊ณ ํ์ ํ์ง๋ง, ํด๊ฒฐํ๋ ๊ฒ์ด ์ฌ์ด ์ผ์ ์๋๋๋ค. ๋ฌธ์ ๋ "ํํฌ๊ฐ ํ๋ ์์ํฌ์ ์์ด์ผ ํ๋์ง ์๋๋ฉด ๋ณ๋์ ํจํค์ง์ ์์ด์ผ ํ๋์ง"๊ฐ ์๋๋๋ค. ์ด๋ ์ ๋ ๊ทธ ๊ฒฐ์ ์ ์ด๋ฏธ ๋ด๋ ค์ก์ต๋๋ค. flutter_hooks๋ pub.dev์์ 1๋ ๋๊ฒ ์ฌ์ฉ ๊ฐ๋ฅํ์ผ๋ฉฐ ์ธ๊ธฐ ์๋ ํจํค์ง๋ก ๋ณด์ ๋๋ค. flutter_hooks๋ฅผ ์ง์ ์ผ๋ก ์ธ๋ จ๋ ๊ฒฝํ์ผ๋ก ๋ง๋ค๋ ค๋ฉด ์ด๋ฏธ ์๋ฃ๋ ๊ฒ ์ธ์๋ ์๋นํ ์์ ๊ณผ ํฌ์๊ฐ ํ์ํฉ๋๋ค.
๊ทธ ๋ง์ ์์ ์ด ์ด๋ฏธ ํต์ฌ ํ๋ ์์ํฌ ํด๋์ค์ ๋ํด ์ํ๋์์ผ๋ฉฐ _์ฌ๋ฌ ๊ฐ์ ์์ง๋์ด๋ง ํ๊ณผ ์ฌ๋ฌ ์คํ ์์ค ๊ธฐ์ฌ์๊ฐ ์๋ ์ง์ ์ ๋๋ฌํ๋ ๋ฐ ์๋ ์ด ๊ฑธ๋ ธ์ต๋๋ค. ๋๋ก๋ "repo X์ ๋ณํฉํ๋ฉด ํด๊ฒฐ๋์ง ์์ ๋ชจ๋ ๊ฒ์ด ํด๊ฒฐ๋ฉ๋๋ค!"๋ผ๋ ํ์์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์ผ์ด ๋ฐ์ํ๋ ๋ฐฉ์์ ๊ทธ๊ฒ์ ๋ํด ํฅ๋ถํ๋ ์ฌ๋๋ค์ด ๊ตฌํ ์์ ์ ์ํํ๋ค๋ ๊ฒ์ ๋๋ค. @rrousselGit ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ฏธ ๋ง์ ์์ ์ ์ํํ์ผ๋ฉฐ, ๋ค๋ฅธ ์ฌ๋ฌ ๊ธฐ์ฌ์๋ค๋ ํํฌ ์ ์ฅ์์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๊ฐ๋จํ ๋งํด์ ํํฌ๋ Flutter ์ ์ฅ์์ ์์ง ์์๋ ํ๋ฅญํ๊ฒ ์๋ํ ์ ์๊ณ , Flutter ์ ์ฅ์์ ์๋ค๊ณ ํด์ ๋ฏธํด๊ฒฐ ๋ฌธ์ ๋ฅผ ๋ ๋นจ๋ฆฌ ํด๊ฒฐํ ์๋ ์์ผ๋ฉฐ Hooks๊ฐ Flutter์์ ์๋ํ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ดํ๋ ๋ชจ๋ ์ฌ๋์ด ๊ทธ๋ ๊ฒ ํ ์ ์๋ ๊ถํ์ด ์์ ํ ์์ต๋๋ค.
๊ธ์, ๋ด ์๊ฒฌ์ผ๋ก๋ ํํฌ๋ ๋์ sync /async ์์ฑ๊ธฐ์ ์ ์ฌํ ์ธ์ด ๊ธฐ๋ฅ์ด์ด์ผ ํฉ๋๋ค.
๊ทธ๊ฒ์ ํ๋ฌํฐ์ ์ ํ ๊ด๋ จ๋ ํ์๊ฐ ์์ต๋๋ค.
ํํฌ๊ฐ ํด๊ฒฐํ๋ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
State
๋ ํ์์
๋๋ค.๊ทธ๋ฌ๋ ๋์ฒด ๊ตฌ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
class MyWidget extends HookWidget {
const MyWidget({Key key, this.title}): super(key: key);
final String title;
Hook<Widget> build() hook* {
final (flag, setFlag) = yield false;
final (animationController) = yield* useAnimationController(duration: const Duration(seconds: 2));
// TODO: do something with animationController
return CheckBox(
value: flag,
onChanged: setFlag,
);
}
}
Hook<AnimationController> useAnimationController({required Duration duration}) hook* {
final (tickerProvider) = yield* useTickerProvider();
final (animationController) = yield AnimationController(duration: duration, vsync: tickerProvider);
animationController.duration = duration;
return animationController;
}
์ด๊ฒ์ flutter_hook๊ณผ ๋์ผํ ํจ๊ณผ๋ฅผ ๋ฌ์ฑํ์ง๋ง flutter์ ๋ ๋ฆฝ์ ์ด๋ฉฐ flutter_hook์ด ํ ์ ์๋ ์ฌ๋ฌ ์ต์ ํ ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก _anything_์ด ์์ ฏ๋ฟ๋ง ์๋๋ผ ํํฌ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
ํฅ๋ฏธ๋ก์ด ์์ด๋์ด๋ค์. ๊ฑฐ๊ธฐ์ ์ฌ๋ฌ ์ธ์ด ๊ธฐ๋ฅ ์์ฒญ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค(Go์ defer
, C++์ ๊ฒฐ์ ์ ์๋ฉธ์, ์์์ ์ผ๋ก ๊ธฐ๋ฅ์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑํ๋ ๊ธฐ๋ฅ) - ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ค์ ๋ก ์ฌ๋ฐ๋ฅธ ์์น๊ฐ ์๋๋๋ค. ์ถ์ ํ ์ ์์ต๋๋ค.
Flutter์ ํํฌ์ ๊ฐ์ ๊ธฐ๋ฅ์ด ์์ด ์ฌ๋๋ค์ด ๊ฒช๊ณ ์๋ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ , ์์ํ ์๋ฃจ์ ์ ์ ํํ์ง ์๊ณ ํด๋น ๋ฌธ์ ์ ๋ํด ๊ตฌ์ฒด์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๊ณ ์ถฉ ์ค ์ผ๋ถ๋ ์ฑ๋ฅ, ํ์ง ๋๋ ์ฌ์ฉ์ฑ ํธ๋ ์ด๋์คํ์ ๋ํ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ํ๋ ์์ํฌ๊ฐ ๊ฐ์ ํ๋ ๊ฒ์ผ ์๋ ์์ต๋๋ค(์: ๊ณ ํต์ Y๋ฅผ ํจ์ฌ ๋ ์ ํ์ํค๋ ๋น์ฉ).
ํ์ฌ ์ํ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ๊ฒ ์ต๋๋ค. ์ด ํน์ ์๋ฃจ์ ์ ๋ค๋ฃจ๋ ์ข์ ํจํค์ง๊ฐ ์์ผ๋ฉฐ ์๋ฃจ์ ์์ฒด๋ ํ์ฌ ์ํ์์ ํ๋ ์์ํฌ์ ๋ณํฉํ ์ค๋น๊ฐ ๋ ๊ฒ์ด ์๋๋ฉฐ(์์ ์ค๋ช ๋ ์ด์ ๋ก) ์๋ฃจ์ ์ด ์ค์ ๋ก ํ๋ ์์ํฌ์ ๋ณํฉ๋๋ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค.
@dnfield Hooks๋ ์๊ตฌ ์ฌํญ์ ๋ชจ๋ ์ฃผ์ ์์ญ์ ๋ค๋ฃฐ ๋๋ง '๊ฐ์กฑ'์ฒ๋ผ ์ ์๋ํฉ๋๋ค.
์ํ ๋ณ๊ฒฝ ํ ์ด๋ค ์ข ๋ฅ์ ํจ๊ณผ๊ฐ ํ์ํ ๋ ๋ฒฝ์ ๋ถ๋ชํ๋ฉด ์ํ ํํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ธ๋ชจ๊ฐ ์์ต๋๋ค.
์ค๊ณ์ ๋ชจ๋ ํํฌ๋ ๋ ๋๋ฌ์ ์ฝ์ด ๋ด๋ถ์ ์๋นํ ๋ณ๊ฒฝ์ด ํ์ํ๊ฑฐ๋ ์๋ก์ด ์ข ๋ฅ์ ์ฝ์ด ๊ตฌ์ฑ์์๋ฅผ ๋์ ํด์ผ ํฉ๋๋ค.
๊ทธ๋ฐ ๋ ธ๋ ฅ์ ํ ์ข ๋ฅ์ ํ (๊ณ ํต์ )์ ๋ํด์๋ง ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ์ ์งํฉ์ผ๋ก ํด๊ฒฐํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ๋งํ๊ณ ์ถ์ต๋๋ค. ๋จ์ผ ํํฌ๋ ์ํ ์ ์ฅ ๊ตฌ์ฑ ์์์์ ์ ํํ ๊ฐ์น๊ฐ ์์ผ๋ฉฐ ๋ ๋๋ง ์์ง์ ์ค์ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋์ ํ ๊ฐ์น๋ ์์ต๋๋ค.
์ด ๋ฌธ์ ๊ฐ "๋๋ Flutter๊ฐ React์ ๊ฐ์ผ๋ฉด์๋ Flutter์ ๊ฐ๊ธฐ๋ฅผ ์ํฉ๋๋ค"๋ผ๊ณ ๋งํ๋ ๊ฒ์ด๋ผ๋ฉด ๊ทธ๊ฒ์ด ์ผ๋ง๋ ์คํ ๊ฐ๋ฅํ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ GitHub ๋ฌธ์ ๋ ์๋ง๋ ๊ทธ๋ฐ ๊ฒ์ ์ถ์ ํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฌํ ๊ฒ์ ์ถ์ ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์ธ์ ํ๋๋ผ๋.
๋ค์ ๋งํด Flutter์ ํต์ฌ์ ๋ค์ ์์ฑํด ๋ฌ๋ผ๋ ์์ฒญ์ด๋ผ๋ฉด ์ ๊ทผ ๋ฐฉ์์ด ์ณ์ง ์์ต๋๋ค. ์ ๊ทผํ๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ๋ฌด์์ธ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ ์ฅ์๋ฅผ ๋ถ๊ธฐํ๊ณ ์์ฒญ๋ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด๋ ๊ฒ์ผ๋ก ์์๋ ๊ฒ์ ๋๋ค.
ํํฌ๋ฅผ ์์ง ๋ชปํ๊ณ ๋ค๋ฅธ ๊ธฐ์ ์ ์ ์ง ๊ด๋ฆฌํ๋ ์ฌ๋๋ค์๊ฒ ํํฌ๊ฐ ๋์ ๋๋ฉด ์ด์ํ ๋๋์ด ๋ญ๋๋ค.
"X๊ฐ React์ ๊ฐ๊ฒ ํ๋ ค๋ฉด ๋ฐ์์ ์ฌ์ฉํ์ญ์์ค"์ ๊ฐ์ ์๋ต์ด ์์ฃผ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ด ์๊ฐ์ ํํฌ๋ ๋ณต์กํ ๋ฐ์ดํฐ ๋ก์ง์ ์ฌ์ฌ์ฉํด์ผ ํ๋ ๋ง์ ํ๋ฐํธ์๋ ๋ฌธ์ ์ ๋ํ ์ผ๋ฐ์ ์ธ ์๋ฃจ์ ์ ๋๋ค. ์ด๋ค ๊ธฐ์ ์์๋ ์ฌ์ฉํ ์ ์๋ ์์ด๋์ด์ ๊ฐ๊น์ต๋๋ค.
๊ทธ๋ฌ๋ ํํฌ๋ ๊ฐ์ด ์์ ํ ํ์๋๊ธฐ ์ ์ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ํด ์๊ฐํ๋ ๋ฐ ์ผ์ข ์ ์ ํ์ด ํ์ํฉ๋๋ค. ๋ค๋ฅธ ํ๋ ์์ํฌ์์ ํํฌ๋ฅผ "์์ฒญ"ํ ๋ ํฐ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ React ํ์ด hooks๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ํ๋ฅญํ ์ผ์ ํ๋ค๊ณ ์๊ฐํ์ง๋ง, hooks๊ฐ React์ ๊ฐํ๊ฒ ๊ด๋ จ๋์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ์ ์ ํญ์ด ์๊ธธ ์ ์์ต๋๋ค.
๋๋ React๊ฐ ๋ค์ ํ ์ด ๋ฐ๋ช ๋ ๊ณณ์ด๊ธฐ ๋๋ฌธ์ ์์ฃผ ์ธ๊ธ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. React๋ ๋ํ (์ง๊ธ๊น์ง) ํํฌ์ ๋ํ ์ต๊ณ ์ ์ ๋ณด ์์ค์ ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก - Flutter์์ ์ง์ ๋ฐ์ดํฐ ๋ ผ๋ฆฌ์ ๊ตฌ์ฑ ํจํด์ ์ฌ์ฉํ ์ ์๋ค๋ "๊ณ ํต์ "์ ์ค๋ช ํฉ๋๋ค. ํํฌ๋ ์ด๋ฅผ ํ์ฉํ๋ ์์์ผ ๋ฟ์ ๋๋ค.
๋ํ ํํฌ๋ฅผ ๋์ ํ๋ ๊ฒ์ด ์์ฒญ๋ ์์ ์ด๋ผ๋ ๊ฒ์ ์ดํดํ๊ณ ์์ผ๋ฉฐ ์ํํ ์์ฌ๊ฐ ์๋ค๊ณ ๋งํด์ผ ํฉ๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก "์ปค๋ฎค๋ํฐ๊ฐ ๊ทธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์๋ฌด๊ฒ๋ ํ ํ์๊ฐ ์๋ค"๋ ์ฃผ์ฅ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
์ปค๋ฎค๋ํฐ ์์ ์ด Google์์ ๋ ์ํ ์ ์๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
์ปฌ๋ ์
๋ด๋ถ์ ํํ์์ ์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
์ปค๋ฎค๋ํฐ๋ null
๋ฅผ ์ง์ํ๋๋ก Row/Column/ListView/... ๋ฅผ ๋ถ๊ธฐํ์ฌ "์์ "ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ Google์ ์ธ์ด๋ฅผ ์์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
๋ํ Flutter ์์ฒด์์ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค. Flutter๋ React์์ ์๊ฐ์ ๋ฐ์์ต๋๋ค.
์ด๊ฒ์ Widget์ด ์ฌ์ฉ๋๋ ๋ฐฉ์์ ํฐ ๋ถ๋ถ์ด ๊ธฐ๋ณธ์ ์ผ๋ก React ํด๋์ค๊ฐ ์ฌ์ฉ๋๋ ๋ฐฉ์์ ๋ณด๋ฉด ์ ์ ์์ต๋๋ค.
์ด๊ฒ์ด Flutter๊ฐ React์ ์ผ์นํด์ผ ํ๋ค๋ ์๋ฏธ๋ ์๋์ง๋ง Flutter ํ์ด ์ต์ํ React ์
๋ฐ์ดํธ์ ์ํ๊ณ๋ฅผ ๋ฉด๋ฐํ ์ดํด๋ณด๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค.
์ด๊ฒ์ ์ปค๋ฎค๋ํฐ ์ฃผ์ฅ ์ธ์ "ํ๋ ์์ํฌ์์ ํํฌ๋ฅผ ์ํ์ง ์๋" ์ด์ ์ ๋ํด ์ต์ํ ๋ ๋์ ๋ต๋ณ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
@rrousselGit @pie6k
์ ๋ ๊ฐ์ธ์ ์ผ๋ก Hooks API๊ฐ React์์์ ๊ฐ์ด ์ดํดํ๊ธฐ ์ด๋ ต๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์๋ช ์ฃผ๊ธฐ ๋ฐฉ๋ฒ๊ณผ ์ค๋ช ์ด ํฌํจ๋ ์ด๋ฆ์ ์ ํธํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด "๋์ ๋ฌธ์ "๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ฐ๋ฆฌ๊ฐ ๋ฌธ์ ๋ฅผ ๋ฐ์๋ค์ด๊ณ ์๋ฃจ์ ์ ๋ค๋ฅด๊ฒ ๊ตฌํํด์ผ ํ๋ค๊ณ ๋งํ๋ @dnfield ์๊ฒฌ์ ์ง์งํฉ๋๋ค.
๋ํ ๋ ๊ฐ์ ๊ฐ๋ณ ์์ ฏ์ด ๋์ผํ ๋ ผ๋ฆฌ๋ฅผ ๊ณต์ ํด์ผ ํ๋ ์ํฉ์ ๊ฑฐ์ ๋๋ฌํ์ง ์์์ต๋๋ค(์ด๊ฒ์ด Hooks์ ์ฃผ์ ์ด์ ์ผ๋ก ์ดํดํ ๊ฒ์ ๋๊น?)
Flutter๊ฐ React์์ ์๊ฐ์ ์ป์๋ค๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค. ํ์ง๋ง ์ด๊ฒ์ด ๋ชจ๋ React ํจํด๊ณผ ์ํคํ
์ฒ๋ฅผ ์์ํ ๋ฐ๋ฅผ ๊ฒ์ด๋ผ๋ ์๋ฏธ๋ ์๋๋๋ค.
๋ด๊ฐ React์์ ๊ฒช์๋ ์ฃผ์ ๋ฌธ์ ์ค ํ๋๋ ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ด ๋๋ฌด ๋ค์ํ๊ณ "๊ถ์ฅ ์ฌ๋ก"๊ฐ ๋งค์ผ ๋ณ๊ฒฝ๋๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๊ฒ์ด ์ํํธ์จ์ด ์์ง๋์ด๋ง์ ํน์ฑ์ด๋ผ๋ ๊ฒ์ ์ดํดํ์ง๋ง, ์ฌ์ ํ ๊ธฐ์กด ๋ฐฉ์์ ๋์ ์ ์ด ์๋ค๋ฉด ๊ฐ์ ์ ์๋ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ์ ๊ฒ์ ๋ฌ์ฑํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๋ ๋์ โฆ
๋๋ ์ด๊ฒ์ด ๋น์ ์๊ฒ ์ฝ๊ฐ ๋ค๋ฅธ ๊ด์ ์ ์ ๊ณตํ๊ณ ๋๊ตฐ๊ฐ์ ๊ธฐ๋ถ์ ์ํ๊ฒ ํ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Flutter ์ปค๋ฎค๋ํฐ์ ๋ํ ๊ทํ์ ๊ธฐ์ฌ์ ๋ํด ๊น์ ์กด๊ฒฝ์ ํํฉ๋๋ค.
์ฌํ๊ฒ๋ ์ด ๋ฌธ์ ๋ ์ข ๋ฃ๋์์ต๋๋ค. Flutter ํ์ด ํํฌ์ ๋ํด ๋ฌด์งํ๊ฑฐ๋ ๋์์ธ ํจํด์ ํ์ฌ ์ํ์ ๊ด์ฌ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค(๊ทธ๋ ์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค). ์ด๊ฒ์ ์ด๋ค ๊ธฐ์ ์๋ ์ข์ง ์์ต๋๋ค. ์๋ฐฑ ์๊ฐ์ ํฌ์ํ๋ ์ฌ๋๋ค์ ์์ ์ด ์ฌ์ฉํ๋ ๊ฒ์ด ์ต๊ณ ์์ค์ด๊ณ ๊ทธ์ ํ์ ํ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์ถ์ดํ๋ฉฐ ํ์ฌ ๊ฐ์ฅ ์์ฐ์ ์ธ ํจํด์ ํํฌ์ด๊ณ Flutter๋ ๋ค์ณ์ ธ ์์ง๋ง ์ ์ง ๊ด๋ฆฌ์๊ฐ ์ค๋๋ ฅ ์๊ฒ ๋ ๋์ ๋์์ ์ํด ๊ณ ๋ คํ๊ฑฐ๋ ๋ฌด์ํ์ง๋ ์์ต๋๋ค.
@cgarciae ์๋ฌด๋ ๋ฌด์งํ์ง ์์ต๋๋ค. @dnfield ๋ ๋ถ๋ช ํ ๋งํ์ต๋๋ค. ๊ธฐ์กด ์๋ฃจ์ ์ ์ง๋ด๋ ค๊ณ ํ๋ ๋์ , ํด๋น ๋ฌธ์ ์ ๋ํ ๋ฌธ์ ๋ฅผ ์ด์ด์ Flutter ํ์ด ์ด๋ฅผ ํ๊ฐํ๊ณ ์๋ง๋ Flutter์ ๋ ์ ํฉํ ์๋ฃจ์ ์ ์ ์ํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ์ปค๋ฎค๋ํฐ๊ฐ ๊ฐ๋ ฅํ๊ฒ ์์ฒญํ๊ณ ์์ฒญํ๋ ค๊ณ ํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ๋ฌธ์ ๊ฐ ์ฌ๋ฐ๋ฅธ ์์น๊ฐ ์๋ ๊ฒฝ์ฐ ์ปค๋ฎค๋ํฐ์์ ์๊ตฌ ์ฌํญ์ ๋ฑ๋กํ๋ ๊ธฐ๋ฅ ์์ฒญ์ด ์์ต๋๊น?
@SpajicM ๋๋ ๋๋ต์ผ๋ก "์๋์ค"๋ก ์์ ํ ๊ด์ฐฎ์ต๋๋ค.
๋ด๊ฐ ๋์ํ์ง ์๋ ๊ฒ์ ํ์ฌ์ ์ ๋น์ฑ์
๋๋ค.
๋ช ๊ฐ์ง ์ฐธ๊ณ ์ฌํญ:
์ด๊ฒ๋ค์ ํํฌ์ ๋ํด ๋ ผ์ํ๋ ๋ฐ ์ง์คํด์ผ ํฉ๋๋ค. ๋ฐ๋์ ๊ตฌํํ์ง๋ ์์ง๋ง ์ต์ํ ํ์ํฉ๋๋ค.
๊ฒฐ๊ตญ ์ํต์ ๋ฌธ์ ๋ก ๊ท๊ฒฐ๋๋ค.
์ปค๋ฎค๋ํฐ๋ก์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฆ ๋๋ค.
ํ ๊ฑธ์ ๋ ๋์๊ฐ React ํ์ด Flutter ํ์ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์ค๋ช ํ๊ฒ ๋ค๊ณ ์ ์ํ์ ๋ ์ปค๋ฎค๋ํฐ๊ฐ ์ด ๋ฌธ์ ๋ฅผ "ํ ์ด ํด๊ฒฐํ๋ ๋ฌธ์ ๋ ๋ฌด์์ ๋๊น"๋ก ๋๋๋๋ก ์ ์๋ ๊ฒ์ ์์ด๋ฌ๋์ปฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@rrousselGit ๋๋ ๊ทธ ์ด๋ฉด์ ์๋ ์์ด๋์ด๊ฐ ์ฌ์ฉ์๋ก๋ถํฐ ์ง์ Flutter ๊ด๋ จ ์ธก๋ฉด์ ๋ฌธ์ ๋ฅผ ๋ฃ๊ณ React์ ์ถ๋ก ์ ์ทจํ๋ ๋์ ์ถ๋ฐ์ ์ผ๋ก ๋ฐ์๋ค์ด๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ๊ทธ๋ค์ ์ ๋ ฅ์ด ๊ฐ์น๊ฐ ์๋ค๋ ๋ง์ ์๋๋๋ค.
๋ด ์๊ฐ์๋ ์์ ฏ์ ๋ ผ๋ฆฌ์ ๋์์ธ์ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋์ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ๊ฐ ์๋ค๋ ๋ฐ๋ ๋์ ํ์ง๋ง React๊ฐ ์ํํ๋ ๋ฐฉ์์ด ์ ์๊ฒ ๋ค์ ํผ๋์ค๋ฝ๊ณ Flutter์ ๋ฏธ๋ ์๋ฃจ์ ์ด ๋ ๊ทน์ ์ธ ํจ๋ฌ๋ค์ ๋ณํ/ํ์ต ๊ณก์ . ์๊ฐ์ ์์ง๋ง ์ด๋ฆฐ ๋ง์์ ๊ฐ๊ณ ๊ธฐ์กด Hooks ๊ตฌํ์ ๊ณ ์ ๋์ง ์๋๋ค๋ฉด ์ปค๋ฎค๋ํฐ์ ํ์ด ํจ๊ป ๋ญ๊ฐ๋ฅผ ์๊ฐํด๋ผ ์ ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
๋ค์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์ ๋๋ค.
_"Flutter๋ ์์ ฏ ๋ก์ง์ ๋ถ๋ฆฌํ๊ธฐ ์ํ ๋ ๋์ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค"_
๋๋ https://svelte.dev/ ๊ฐ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ค๋ฅธ ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ก Flutter ํ์ ๋ฌธ์ ๊ฐ ์๊ณ ํด๊ฒฐ์ฑ ์ด ํ์ํ๋ค๋ ๊ฒ์ ์ธ์ํด์ผ ํฉ๋๋ค.
์ ๋ ํ๋ฌํฐ๊ฐ ์ฒ์์ด๊ณ API์ ๋ง์ ์์ฉ๊ตฌ๊ฐ ์๋ค๋ ๋๋์ด ๋ญ๋๋ค. Dart์๋ ์ผ๋ฐ ๊ธฐ๋ฅ์ด ์๋ค๊ณ ์๊ฐํ๋๋ฐ ๋ณต์ฌํ์ฌ ๋ถ์ฌ๋ฃ๊ธฐ๊ฐ ๋ ์ผ๋ฐ์ ์ด๊ณ ๋ ์ฌ์ด Go์์ ํ๋ก๊ทธ๋๋ฐํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ํนํ ํ์ฅ ๋ฐฉ๋ฒ์ ์ต๋ํ ์ฌ์ฉํ์ฌ NNDB๊ฐ ์ถ์๋ ๋ ์์ฒญ๋ ๋ฆฌํฉํ ๋ง์ด ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ํ์ฅ ๋ฉ์๋์ ๊ฐ์ ๊ฒ์ ํตํ ์ ์ง์ API ์ถ์ํ๋ ํ์ํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
IMHO, Flutter ํ์ "๋ชจ๋ ๊ฒ์ด ์์ ฏ์ด๋ค"๋ผ๋ ์์ด๋์ด์ ๋๋ฌด ์ด์คํ๊ณ ์์ต๋๋ค. ์์ ฏ์ ์๊ฐ์ ํญ๋ชฉ ๋ฐ ๋ ์ด์์์ ์ ํฉํ์ง๋ง ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ/์ฒ๋ฆฌ์๋ ์ ํฉํ์ง ์์ต๋๋ค. ๋ฒ๊ฑฐ๋ก์ด FutureBuilder
, StreamBuilder
, TweenAnimationBuilder
๋ฑ ๋์ ๊ธฐ๋ฅ์ API๋ฅผ ์ ํธํฉ๋๋ค.
Widget build(BuildContext context) {
final a = useFuture(someFuture);
final b = useStream(someStream);
if (a.value == null || b.value == null) {
return CircularProgressIndicator();
}
final value = a.value + b.value;
final smoothedValue = animate(value, duration: Duration(milliseconds: 100), curve: Curves.easeInOut);
return Slider(
value: smoothedValue
);
}
์ฌ์ค Flutter๋ ์ด๋ฏธ ๋ช๋ช ๊ณณ์์ ํํฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋์ "Fluttery"๋ณด๋ค
MediaQueryGetter {
builder: (BuildContext context, MediaQueryData data) {
...
}
}
๋น์ ์ด ์ฌ์ฉํ ์์๋
final data = MediaQuery.of(context);
๋ถํํ๋ ์ด ๋ฉ์ปค๋์ฆ(๊ฐ์ ธ์ค๋ ๋์ ๊ตฌ๋ )์ InheritedWidget๊ณผ ํจ๊ป๋ง ์๋ํฉ๋๋ค.
์ด ๋ถ๋ถ์์ ์ผ๋ง๋ ๋ ๋ฐ์ ํ ์ ์์์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ฌ๊ธฐ์ ๋ณด๊ณ ์๋ ๋ช ๊ฐ์ง ์ฌํญ์ ๋ง์๋๋ฆฌ๊ณ ์ ํฉ๋๋ค.
GitHub ๋ฌธ์ ์์ _problem_์ ํ๊ฐํ๋ ๊ฒ๋ณด๋ค _solution_์ ํ๊ฐํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ด๋ ต์ต๋๋ค. ์๋ฃจ์ ์ ์ ์ํ ๋ ์น์ธ์ ์ป๊ธฐ ์ํด ๋๋ฌํด์ผ ํ๋ ํจ์ฌ ๋ ๋์ ๊ธฐ์ค์ด ์์ต๋๋ค. ์๋ฃจ์ ์ด ์ ๊ตฌ์ฑ๋์์ผ๋ฉฐ ๊ทธ์ ๋ฐ๋ฅธ ๋ ธ๋ ฅ์ ๊ฐ์น๊ฐ ์์ผ๋ฉฐ ํ์ํ ๋ ธ๋ ฅ ์์ค์ ์์ํ๋ ๋ช ๊ฐ์ง ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ์ด์ผ ํฉ๋๋ค(์ด๊ธฐ ํ๋กํ ํ์ ์ ์ ๋ฐ ๊ตฌํ๋ฟ๋ง ์๋๋ผ ์ง์์ ์ธ ๊ด๋ฆฌ ๋ฐ ํ์ง ํฌํจ). . ๋ค์ ๋งํด, ๋ฐ์ดํฐ ๋ฐ ์์ ฏ ์ํ ๊ด๋ฆฌ์ ๊ด๋ จ๋ ํน์ ๋ฌธ์ ๋ฅผ ๋ ผ์ํ๋ ๋ฌธ์ ๋ ๋ง์ ์๋ฃจ์ ์ผ๋ก ์ด์ด์ง ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๊ทธ ์ค ์ผ๋ถ๋ ํ๋ ์์ํฌ์ ์ฑํ๋ ์ ์๊ณ ์ผ๋ถ๋ ํ์ฌ ํจํค์ง๊ฐ ๋ ์ ์์ผ๋ฉฐ ์ผ๋ถ๋ ๊ทธ ์ค ํ๋๋ ์ข์ง๋ง ๋น์ฉ์ด ๋๋ฌด ๋ง์ด ๋ญ๋๋ค.
Flutter ๋ฐ Dart์์ ์์ ํ๋ Google ์์ง๋์ด๋ ํญ์ ๋ ๋์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ํญ์ ๋ถ์ฃผํฉ๋๋ค. Flutter์ ๊ธฐ์ฌํ๋ ๋ง์ ๋น Google ์์ง๋์ด๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ด ๋ฒ๊ทธ๊ฐ ๋ซํ๋ค๊ณ ํด์ ์ด๋ค Google ์์ง๋์ด๋ Flutter์์ ํํฌ๊ฐ ๋ ์ ์๋ํ๋๋ก ํ๋ ์์ ์ ํ์ง ์์ ๊ฒ์ด๋ผ๋ ์๋ฏธ๋ ์๋๋๋ค. ํํฌ ํจํค์ง๊ฐ ์ปค๋ฎค๋ํฐ ๊ตฌ์ฑ์์ ์์ ๋ผ๋ ์ฌ์ค์ ํจํค์ง์ ํ์ง์ด๋ ๊ทธ ๊ฐ์น๋ฅผ ์ด๋ป๊ฒ๋ ๋จ์ด๋จ๋ฆฌ์ง ์์ต๋๋ค. ๋ํ ๋ถ์/๋ฆฐํ ์ ๋ํ ๋ ๋์ ์ง์๊ณผ ๊ฐ์ด ์ด ๋ฒ๊ทธ์์ ์๋ณ๋ ์ผ๋ถ ๋จ์ ์ ์ถฉ์กฑํ๋ ๋ฅ๋ ฅ์ ๊ฐ์์ํค์ง๋ ์์ต๋๋ค.
๊ธฐ๋ฅ์ ์๋ฝํ๊ฑฐ๋ ๊ฑฐ๋ถํ๋ ๋ฐ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค. ๋๋ก๋ ๊ธฐ๋ฅ์ด ์ ๋ง ๋ฉ์ง์ง๋ง ์ํคํ ์ฒ์ ์ ๋ง์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๋๋ก๋ ๊ธฐ๋ฅ์ด ํ๋ฉด์ ์ผ๋ก๋ ์ข์ ๋ณด์ด์ง๋ง ํด๊ฒฐ๋์ง ์์ ๋ช ๊ฐ์ง ์ฃผ์ ๋จ์ ์ด ์์ต๋๋ค. ๋๋ก๋ ๊ธฐ๋ฅ์ด ํ๋ฅญํ๊ณ ์ถฉ๋ถํ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด๋ฉด ์ ํฉํ์ง๋ง ๋น์ฉ์ด ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ๋ ๊ฐ์น๋ณด๋ค ํฌ๊ฑฐ๋ ๋ค๋ฅธ ํจ์ฌ ๋ ๊ฐ์น ์๋ ๊ธฐ๋ฅ์ ํ์ํ ์๊ฐ์ ๋นผ์์ ์ ์์ต๋๋ค. ํนํ Flutter์ ๊ฒฝ์ฐ ๋๋ก๋ ํ์ฌ ํจํค์ง๋ก ํ์ฅํ ์ ์๋ ๊ณ ๋๋ก ๊ณ์ธตํ๋ ์ํคํ ์ฒ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ๋ ์์ํฌ์ ์๋ก์ด ๊ฒ์ ํฌํจํ๋ ๊ฒ๋ณด๋ค ๋ฐฐ์น๋ฅผ ์ ์งํ๊ณ ํ์ฌ๊ฐ ํ๋ฅญํ ์์ ์ ์ํํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ฌ๋ฌ ๋ฒ ๋ ์ข์ต๋๋ค. https://github.com/flutter/packages/tree/master/packages/animations์ ์๋ ์๋ก์ด ์ ๋๋ฉ์ด์ ํจํค์ง์ ๊ฐ์ ํจํค์ง์์ ์ด ์์ ์ ์ง์ ์ํํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ๋๋ ์ด๊ฒ์ ๋ฐ๋ํธ์ ์์์ต๋๋ค. ์ ๋ ํจํค์ง ๊ด๋ฆฌ์์ด๋ฉฐ ํจํค์ง๋ฅผ ๋ ์ฝ๊ฒ ์ ์ง ๊ด๋ฆฌํ๊ฑฐ๋ ๊ฐ๋ฐํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฅ ์ ์์ ๊ฑฐ๋ถํ์ต๋๋ค. ๋ด ์ ์ผํ ์กฐ์ธ์ ๋ง์์ ๋๋ ํ๋ฅญํ ํจํค์ง๊ฐ ์์ผ๋ฉด ๊ณ์ ์์ ํ๋ผ๋ ๊ฒ์ ๋๋ค. ์ด ์ ์ฅ์์ ํฌํจ๋์ด ์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ค๋ฅธ ์ฌ๋๋ค๋ ์ด๋ฅผ ์ธ์ํ๊ณ ๋์์ ์ค ๊ฒ์ ๋๋ค.
Android ์ ComposeUI์๋ ์ํ์ ๊ฐ์ ํํฌ๊ฐ ์์ต๋๋ค. (preview2)
val state = remember { CardDesignerState() } // react: let state = useState(CardDesignerState())
val thing = stateFor<T?> { null } // react: let thing = useState()
๋ํ iOS์ ์๋ก์ด SwiftUI์๋ ๋น์ทํ ๊ฒ๋ค์ด ์์ต๋๋ค(๊ทธ๋ฌ๋ ๋ด๋ถ์ ์ผ๋ก).
// from https://developer.apple.com/tutorials/swiftui/animating-views-and-transitions
Image(systemName: "chevron.right.circle")
.imageScale(.large)
.rotationEffect(.degrees(showDetail ? 90 : 0))
.scaleEffect(showDetail ? 1.5 : 1)
.padding()
.animation(.easeInOut)
iOS์ swiftUI๊ฐ onCreate, onInit, onUpdate, onExit, ... ๐คข
๊ทธ๋ฌ๋ ์ต๊ณ ์ ํ๋ ์์ํฌ(๋ฌผ๋ก Flutter์)๋ ์ฌ์ ํ ํํฌ ์ฌ์ฉ ์์ด๋์ด์ ์ ํญํฉ๋๋ค. ๊ทธ ์ด์ ๋ ๋ฌด์์
๋๊น?
React/ReactNative์ฒ๋ผ ์๊ฒผ์ผ๋๊น!!! ๋๋ ์ ์ง ๊ด๋ฆฌ์ ํ์ ๋๋ผ์ด ์ธ์ฉ๋ฌธ:
๋๋ ์์ฉ๊ตฌ๋ฅผ ๋ณด๋ ๊ฒ์ ์ ํธํ๋ค
๋ถ๋ช ํ ์ ์ธ์ ๊ตฌ๋ฌธ ์ผ๋ก UI๋ฅผ ์์ฑํ๋ ํ๋ฌํฐ ์์ด๋์ด์ ๋ฐ๋ํฉ๋๋ค.
ํํฌ ๋ฏน์ค ์ธ์ด ์ข์ ์๋ฃจ์
์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ข์ํ๋ ๊ณณ์ ํํฌ๋ฅผ ๋๊ณ ๊ตฌ์ ๊ฐ๋ฐ์ ์ฝ๋์ ํ๋ ์์ํฌ๋ฅผ ๊ฑด๋๋ฆฌ์ง ๋ง์ญ์์ค.
๊ทธ๋ฌ๋ ์ด ์์ด๋์ด์ ๋ค๋ฅธ ํ๋ฅญํ ์์ด๋์ด๋ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ธด๋ฐํ ํตํฉ์ด ํ์ํ๋ฉฐ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ผ๊ธ ์ง์ํ๋ ํต์ฌ ์ ์ง ๊ด๋ฆฌ์๋ฅผ ๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ํ ํํฌ ํตํฉ ์ดํ์ ๋ฏธ๋๋ฅผ ์์ํ ์ ์์ต๋๋ค. ๋ง์ ์ต์์ ํ๋ ์์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: ๋จธํฐ๋ฆฌ์ผ)๊ฐ ํฌ๊ฒ ์ง์ํ๊ณ ์ฌ์ฉํ๊ธฐ๊น์ง ํฉ๋๋ค.
Flutter๊ฐ ๋ ์๋ฆ๋ค์ธ ์ ์์ต๋๋ค.
// this is just scratch, not a complete and true use-case
build(context) {
final angle = useAnimation(2*PI, 0, 5 /*seconds*/);
return Image.from(myAwesomeImage)
.padding(8)
.scale(2.5)
.rotate(angle);
}
@HKhademian ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ํํฌ์ ๊ฐ์ ๊ฒ(๋๋ ๋ค๋ฅธ ์ฉ์ด๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋น์ฆ๋์ค ๋ก์ง์ ์ ์ ํ ๊ตฌ์ฑ์ ํ์ฉํ๋ ๊ฒ)์ ๋ํ ์ผ๊ธ ์ง์์ ๋ถ์กฑ์ ์ฌ์ค ์ ๊ฐ ๋ง์ง๋ง ํ๋ก์ ํธ์์ Flutter๋ฅผ ์ ํํ์ง ์์ ์ ์ผํ ์ด์ ์ ๋๋ค.
2. ํํฌ ํจํค์ง๊ฐ ์ปค๋ฎค๋ํฐ ํ์์ ์์ ๋ผ๋ ์ฌ์ค์ ํจํค์ง์ ํ์ง์ด๋ ๊ฐ์น๋ฅผ ์ด๋ป๊ฒ๋ ๋จ์ด๋จ๋ฆฌ์ง ์์ต๋๋ค. ๋ํ ๋ถ์์ ๋ํ ๋ ๋์ ์ง์๊ณผ ๊ฐ์ด ์ด ๋ฒ๊ทธ์์ ์๋ณ๋ ์ผ๋ถ ๋จ์ ์ ์ถฉ์กฑํ๋ ๋ฅ๋ ฅ์ ๊ฐ์์ํค์ง๋ ์์ต๋๋ค. /๋ฆฐํ
์ปค๋ฎค๋ํฐ ํ์์ด ํจํค์ง๋ฅผ ๊ณ ์คํธํฉ๋๊น? ์. Google์ ๊ณ ์คํธ ์ฝ์ด Flutter๋ฅผ ์ฌ์ฉํ ์์ ์ ๋๊น? ๊ธ์์, ๋น์ ์ ์ ์ฅ์ ๋ฐ๋ฅด๋ฉด ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ํต์ฌ Flutter๊ฐ ์ปค๋ฎค๋ํฐ ํจํค์ง๋งํผ ์๋น์ ์คํ ๊ฐ๋ฅํ๋ค๊ณ ์ฃผ์ฅํ๋ ๊ฒ์... ๊ธฐ๊ปํด์ผ ์๋ชป๋๊ณ ์ต์ ์ ๊ฒฝ์ฐ ๊ฑฐ์ง๋ง์ ๋๋ค.
๋ํ ์ปค๋ฎค๋ํฐ ์์ฒญ์ ๋ฌด์ํ๊ธฐ ์ํด ๊ฐ์ธ ์ ํธ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ์นํ์ฑ์ ์ ์ฆํ @Hixie ์ ๋์๊ฐ ์์ผ๋ฉด ์ปค๋ฎค๋ํฐ๊ฐ ์ํ๋ ๊ฒ์ด๋ ํ์๋ก ํ๋ ๊ฒ์ด ์ค์ํ์ง ์๋ค๋ ๊ฒ์ด ์ฌ๋ฌ ๋ฒ ์ ์ฆ๋์์ต๋๋ค. ๊ตฌ๋งคํ์ง ์๊ณ ๋ ๋ฐ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๊ฒฐ์ ํ๋ก์ธ์ค๊ฐ ๋๋ฌด ๋ถํฌ๋ช ํ์ฌ ๋ฌ๋ฆฌ ๋ณผ ์ ์์ต๋๋ค.
๋ด๊ฐ ๊ด์ฌ์ ๊ฐ๋ ๊ฒ์ ๊ธฐ๋ฅ์ ์กด์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ์ฌ๋๋ค์ด ๋ชจ๋ฐ์ผ ์ฑ์ ๊ตฌ์ถํ๋ ๋น์ฆ๋์ค ๊ฒฝํ์ด ๊ฑฐ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๊ด์ ์ ํญ์ Flutter์ ํผํฉํ ์คํ์ ๋ํ ๊ฐ์ฅ ํฐ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
์์ฌ ๊ฒฐ์ ํ๋ก์ธ์ค์ ๊ธฐ์ฌํ๊ธฐ ์ํด ์ปค๋ฎค๋ํฐ์ ๋ ๋ง์ ๋น์ค์ ๋๋ Flutter์ ๊ธฐ๋ฅ์ ๊ฒฐ์ ํ๊ธฐ ์ํ ๊ณต์ํ๋ ํ๋ก์ธ์ค๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ถ๋ช ํ 100%๋ ์๋์ง๋ง ์ง๊ธ ๋น์ฅ์ ์ฝ 5%, ๊ทธ ์ ๋๋ฉด ์ํผ ํ๋ ์ดํค 5%์ฒ๋ผ ๋๊ปด์ง๋๋ค. @timsneath
GitHub ๋ฌธ์ ์์ ๋ฌธ์ ๋ฅผ ํ๊ฐํ๋ ๊ฒ๋ณด๋ค ์๋ฃจ์ ์ ํ๊ฐํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ด๋ ต์ต๋๋ค.
React ํ์ ์ด ๋ฌธ์ ์ ์์ ๋ถ๋ถ์์ Hooks์ ์ด์ ๋ฅผ ์ค๋ช
ํ๊ฒ ๋ค๊ณ ์ ์ํ์ต๋๋ค.
React ํ๋ณด๋ค ํํฌ๋ฅผ ๋ ์ ์ค๋ช
ํ ์ ์๋ ์ฌ๋์ด ์๊ธฐ ๋๋ฌธ์ ํํฌ๊ฐ ํ์ํ ์ด์ ๋ฅผ ์ค๋ช
ํด์ผ ํฉ๋๋ค.
๊ด๋ จ ์ด์(๋ฉํ) https://github.com/flutter/flutter/issues/28884
๋ฃจํฌ, ๋๋ ๋น์ ์ ์ด์ ์ ์กด์คํ๊ณ ๊ฐ์ฌํฉ๋๋ค. ํ์ง๋ง ๊ด๊ณ ์ธ์ ๊ณต๊ฒฉ์ ๊ทธ๋งํ์ธ์. ์ฐ๋ฆฌ๋ ๋ชจ๋ ๋ฆฌ์์ค ์ฉ๋, ์ฌ์ฉ์ ์ฐ๊ตฌ, ์ดํด ๊ด๊ณ์ ์ ๋ ฅ, ๊ณ ๊ฐ ์๊ตฌ ๋ฐ ์ปค๋ฎค๋ํฐ ์ ๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ ์ข ๋ฅ์ ์ ์ถฉ์์ ๋ง๋ค์ด ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ต๊ณ ์ ํ๋ซํผ์ ๊ตฌ์ถํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
์น์ ํ์ธ์. https://github.com/flutter/flutter/blob/master/CODE_OF_CONDUCT.md
์ธ์ ๊ณต๊ฒฉ์ ์๋ํ์ง ์์์ต๋๋ค. ํผ๋๋ฐฑ ๊ฐ์ฌํฉ๋๋ค. CoC์ ๋ฐ๋ฅด๋ฉด ์ฐ๋ฆฌ๋ ํจ๊ป ๋ชจ์ฌ ๋ด๊ฐ ์ ๋ฌํ๋ ค๋ ๋ด์ฉ์ ๋ ผ์ํด์ผ ํฉ๋๋ค.
์๊ฒฌ์ด ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ชจ์ฌ์ ์๋ก์ ๊ด์ ์ ์ดํดํ๊ณ ๋ชจ๋ ์ฌ๋์ ๊ด์ฌ์ฌ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋์์ธ์ ์ฐพ๊ธฐ ์ํด ๋ ธ๋ ฅํด์ผ ํฉ๋๋ค.
์ด์ ๋ํ ์
๋ฐ์ดํธ๊ฐ ์์์ต๋๊น? ์๋๋ฉด ์ด๋์์ ์๋ฃจ์
์ ์กฐ์ ํ ์ ์์ต๋๊น? ์ ๋ Flutter ํ๋ก์ ํธ, ํนํ Animations ๋ฐ Transitions์์ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์ต๋๋ค. ํํฌ๋ ๋ฌด์๋ณด๋ค๋ ์ด initState
๋ฐ dispose
์ํ๋ฅผ ๋จ์ผ ํจ์๋ก ์บก์ํํ๊ณ ๋ชจ๋ ๊ฒ์ ์ค์ ํ๋ ๋์ ํด๋น ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
Flutter Overlays(#50961)์ ๋ค๋ฅธ ๋ฌธ์ ์ ๊ฐ์ด ํ๋ฌ๊ทธ์ธ ์ ์ง ๊ด๋ฆฌ์๊ฐ ์๋ Flutter์ ์ธ๋ถ ๊ด์ฐฐ์/์ฌ์ฉ์์๊ฒ ๋ค๋ฆฌ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง์ง ์๋ ํฉ๋ฒ์ ์ธ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ), ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ๋ค์ ๋ฉ์ธํ ์ด๋๋ผ๊ธฐ ๋ณด๋ค๋ ์ฌ์ฉ์๋ค์๊ฒ ์ค์ง์ ์ธ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ผ๋ก ์ผ์ถ๋ ๊ฒ ๊ฐ๋ค. ๋ค์ ๋งํ์ง๋ง, ๊ด๋ฆฌ์์ ๋ํ ๋ฌด๋กํจ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋๊ตฐ๊ฐ๊ฐ ์ด ๋ฌธ์ ์ค๋ ๋๋ฅผ ์๋ฌด๋ ์ง ์๊ฒ ์ฝ๋ ๋ด ์๊ฒฌ์ผ ๋ฟ์ด๋ฉฐ ๋ค๋ฅธ ๋ฌธ์ ์ ๋ํด์๋ ์ ์์ง ๋ชปํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฌ์ฉ์๊ฐ ํฉ๋ฒ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ ์๊ฐํ๋ ๋ฐ ์์ด ๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ์ด๋ป๊ฒ ์งํํ ์ ์์ต๋๊น? ๋๋ Rust๊ฐ ์๋ก์ด ์๋ฃจ์ ์ ์ค๊ณํ๋ ๋ฐ ์ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ํฅ๋ฏธ๋ก์ด RFC ์์คํ ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
@satvikpendem ์ฌ๊ธฐ์์ RFC ํ๋ก์ธ์ค๋ ๋ฌธ์ ๋ฅผ ์ค๋ช ํ๋ ๋ฒ๊ทธ๋ฅผ ์ ์ถํ๊ณ ๋ฌธ์ ๊ฐ ๋ช ํํ๊ฒ ์ค๋ช ๋๋ฉด ๊ฐ๋ฅํ ์๋ฃจ์ ์ ๋ ผ์ํ๋ ๊ฒ์ ๋๋ค.
์ง๊ธ๊น์ง ๋ฌธ์ ๊ฐ ์ค๋ช ๋ ๊ฒ ๊ฐ์ผ๋ฏ๋ก ์ด์ ๊ทํ์ ์๊ฒฌ์ ๋ฐ๋ผ ์๋ฃจ์ ์ ๋ ผ์ํ ์ ์์ต๋๋ค. ๋ค์์ผ๋ก ํ ์ ์๋ ์ผ์ ํํฌ ๋๋ ์ด์ ์ ์ฌํ ๊ฒ๋ณด๋ค ๋ ์ ์๋ํ๋ ๋ค๋ฅธ ์๋ฃจ์ ์ด ์์ต๋๊น?
๋ฒ๊ทธ๋ฅผ ์๋ ค์ฃผ์๋ฉด # ๋ฌธ์ ๊ฐ ๊ฐ๋ฅํ ์๋ฃจ์ ์ ๋ํด ๋ ผ์ํ๋ ๊ฒ์ด ํ๋นํ ๋งํผ ์ถฉ๋ถํ ์์ธํ๊ฒ ๋ฌธ์ ๋ฅผ ์ค๋ช ํ๋์ง ์๋ ค๋๋ฆด ์ ์์ต๋๋ค.
@hixie https://github.com/flutter/flutter/issues/51752
๋ํ Dan์ ์๊ฒฌ์ ๋ํ ํ์ ์กฐ์น๊ฐ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. https://github.com/flutter/flutter/issues/25280#issuecomment -456404333
์ด ํ ๋ก ์ ๊ฒฐ๊ณผ๋ ๋ฌด์์ด์์ต๋๊น?
์๋ Remi, ๋ฒ๊ทธ #51752์ ๋ํด ์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ๋๋ ๋น์ ์ด ์ด ๊ณต๊ฐ์ ์์ฒญ๋ ์๊ฐ์ ํฌ์ํ๊ณ ์ฌ๊ธฐ์ ๋งค์ฐ ๊ฐ์น ์๋ ํจํค์ง๋ฅผ ์ ๊ณตํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. x1000 ๊ฐ์ฌํฉ๋๋ค!
@dnfield ์ ์๊ฒฌ ์ ๋ฐ๋ณตํ์๋ฉด, ์ฐ๋ฆฌ๋ ์์ง ๋ฌธ์ ์์ญ๊ณผ ๊ทธ ์ค์์ฑ์ ๋ํด ์กฐ์ ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์์ ๋ฒ๊ทธ ๋ ํด๋น ๋ชฉํ๋ฅผ ํฅํ ์ ์ฉํ ๋จ๊ณ ๋ฐ/๋๋ ๋ฌธ์ ์ ๋ํ ์ ์ฌ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ ผ์ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์ ์๋ ๊ทํ์ ํ์ ์ง๋ฌธ์ React ํ๊ณผ์ ๋ํ๊ฐ ์ฌ๊ธฐ์์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ผ๊ณ ๊ฐ์ ํ์ง๋ง ์์ง ๋ฌธ์ ์์ญ์ ๋ํ ์กฐ์ ์ด ์๋ค๋ฉด ์๊ธฐ์์กฐ๋ก ๋ณด์ ๋๋ค.
์๋ง๋ ์ฐ๋ฆฌ๋ ํํฌ๋ก ์์ ๋ ๊ทธ๋ฌํ ๋ฌธ์ ๊ฐ ์๋ ์ฑ์ ์ ์ฒด ์๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๋ค. ํํฌ๋ก ๋ค์ ์์ฑํ ํ์๋ ์์ง๋ง ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ๊ฐ ์ผ๋ง๋ ๋๋์ง ๋ณด์ฌ์ค๋๋ค. @timsneath, ํ ๋ก ์ ์ ํฉํ ๊ฒ์ ๋๊น? ์๋๋ฉด ๋ค๋ฅธ ์๊ฐ์ ํ์๊ฒ ์ต๋๊น? ๋ฌธ์ ๊ณต๊ฐ์ ๊ฐ๋ฅํ ํ ๋ช ํํ๊ฒ ํ์ํ๋ ๋ฐฉ๋ฒ์ ์์ ๋ด๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
:์จ์ด๋ธ: @timsneath
์์งํ ๋งํ๋ฉด ์ React ํ๊ณผ ๋
ผ์ํ๋ ๊ฒ์ด ์๊ธฐ์์กฐ์ธ์ง ์ ์ดํด๊ฐ ๋์ง ์์ต๋๋ค.
ํํฌ๋ฅผ ์์ฒญํ๋ ์ปค๋ฎค๋ํฐ๊ฐ ์๋๋ผ๋ React ํ๊ณผ์ ํ ๋ก ์ ์ฌ์ ํ โโ๋งค์ฐ ์ค์ํฉ๋๋ค.
React๋ Flutter์ ๋ง์ ์ ์ฌ์ ์ ๊ณต์ ํ๋ฉฐ ์์ ฏ๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๋ ๋ฐ ๋ช ๋
์ ์ถ๊ฐ ๊ฒฝํ์ด ์์ต๋๋ค.
๊ทธ๋ค๊ณผ ๋ ผ์ํ๋ ๊ฒ์ ์ ๋น์ฌ์์๊ฒ๋ง ์ด์ต์ ๊ฐ์ ธ๋ค ์ค ์ ์์ต๋๋ค.
์๋ก์:
flutter_hooks๋ฅผ ๋ง๋ ํ Dan์ผ๋ก๋ถํฐ ์ฐ๋ฝ์ ๋ฐ์ ํํฌ์ ๋ํ ํซ ๋ฆฌ๋ก๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋
ผ์ํ์ต๋๋ค.
๋ด ๋๋ต์ "Flutter๊ฐ ์ ํ ์ธ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ ์ผ์ด ๊ฑฐ์ ์์์ต๋๋ค"์์ต๋๋ค.
๋ช ๊ฐ์ ํ Babel์ ์ฌ์ฉํ์ฌ ์ ํ๊ณผ ์ ์ฌํ ๊ฒ์ ์์ฑํ์ฌ React์ ํซ ๋ฆฌ๋ก๋๋ฅผ ๊ฐ์ ํ์ต๋๋ค.
Flutter์ React ํ์ด ๋ ผ์ํ๋ค๋ฉด ๊ทธ๋ฌํ ์ํธ ์์ฉ์ด ๋ง์ด ์ผ์ด๋ ์ ์๊ณ ๋ ๊ธฐ์ ๋ชจ๋ ๋ฐ์ ํ ๊ฒ์ด๋ผ๊ณ ํ์ ํฉ๋๋ค.
ํน์ ๋ฌธ์ ์์ด ์ง๋ฌธํ ์ ์๋ ๋ช ๊ฐ์ง ๊ฐ๋ฐฉํ ์ง๋ฌธ:
@satvikpendem ์ฌ๊ธฐ์์ RFC ํ๋ก์ธ์ค๋ ๋ฌธ์ ๋ฅผ ์ค๋ช ํ๋ ๋ฒ๊ทธ๋ฅผ ์ ์ถํ๊ณ ๋ฌธ์ ๊ฐ ๋ช ํํ๊ฒ ์ค๋ช ๋๋ฉด ๊ฐ๋ฅํ ์๋ฃจ์ ์ ๋ ผ์ํ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๋ฒ๊ทธ๊ฐ ์๋ ๋ชจ๋ ํ ๋ก ์ด ๋ฌด์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น? RFC์ ๋ชฉ์ ์ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐ์ ๊ฒฝํ์ด๋ ๋๊ตฌ ์๋ฏธ์ ๊ฐ์ ๋ณด๋ค ์ฃผ๊ด์ ์ธ ๊ฒ์ ํ์ฅํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ "ํํฌ๊ฐ ์ฌ๋ฌ ํ๋ ์์ํฌ์์ ๊ด์ฉ์ ์ด ๋๊ณ ์๊ณ ์ฌ๋๋ค์ด ๊ฐ์ ๋ ๊ฒฝํ๊ณผ ์์ฐ์ฑ์ ๋ณด๊ณ ํ๊ธฐ ๋๋ฌธ์ ํํฌ๊ฐ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค."๋ผ๊ณ ๋งํ๋ค๋ฉด ์ด๋ ์ ํจํ ํ ๋ก ์ด์ง๋ง ์ฌํ ๊ฐ๋ฅํ ๋ฒ๊ทธ๋ ์๋๋๋ค.
๋๋ ์๋ฌด๋ "๋ฒ๊ทธ๊ฐ ์๋ ํ ๋ก ์ ๋ฌด์๋ ๊ฒ์ด๋ค"๋ผ๊ณ ๋งํ ์ฌ๋์ด ์๋ค๊ณ ํ์ ํฉ๋๋ค. ์, ์๋ก๋ฅผ ์กด์คํ๊ณ ์์ ๋ฐ๋ฅด๊ฒ ๋ํ๋ฉด์ ์ ์๋ก ํจ๊ป ์ผํฉ์๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ฌ๊ธฐ์์ ์ต์ ์ ๋คํ๊ณ ์์ง๋ง, ์ฐ๋ฆฌ์ ๊ด์ฌ์ ๋๊ธฐ ์ํด ๊ฒฝ์ํ๋ ๋ค๋ฅธ ๋ง์ ๋ฒ๊ทธ, ๋์์ธ ๋ฐ ์์ด๋์ด๊ฐ ์์ต๋๋ค. :)
@lukepighetti , ์์ด๋ฌ๋ํ๊ฒ๋ "๋ค๋ฅธ ํ๋ ์์ํฌ์ ํํฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํํฌ๊ฐ ์์ด์ผ ํฉ๋๋ค"๋ ์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ ํผํ๋ ค๊ณ ํ๋ ๋ํ์ ์ข ๋ฅ์ ๋๋ค. ์๋ํ๋ฉด ์ ์์ ๋ฐ๋ผ ๋ค๋ฅธ ํ๋ ์์ํฌ์ ์๊ตฌ์ ์ต์ ํ๋ ๋์์ธ์ผ๋ก ์ด์ด์ง๊ธฐ ๋๋ฌธ์ ๋๋ค. Flutter์ ๋งฅ๋ฝ์์ ํด๊ฒฐํ๋ ค๊ณ ํ๋ ๋ฌธ์ ๋ฅผ ์ค๋ช ํ๋ ๊ณผ์ ์์ ์ ๋ง ๋์์ด ๋ฉ๋๋ค. ์ด๋ ๋ฌธ์ ๊ฐ ๋์ผํ์ง ์ฌ๋ถ, ์๋ฃจ์ ์ด ๋์ผํด์ผ ํ๋์ง ์ฌ๋ถ ๋ฑ์ ๋ํด ๋ชจ๋ ๋์ํ๋ ๋ฐ ๋์์ด ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
@rrousselGit -- ๋ฌผ๋ก , React ํ๊ณผ ํ ์ ์๋ ์ ์ฉํ ์ผ๋ฐ์ ์ธ ๋ํ๊ฐ ์์ต๋๋ค. ๋๋ ๊ทธ ์ ์์ ํ์ํ๋ฉฐ, ์๋ง๋ ์ฐ๋ฆฌ๋ ์ธ์ ๊ฐ๋ ๊ทธ๋ ๊ฒ ํด์ผ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ค์ ํ์คํ ๊ทธ ํ์ ๋ง์ ์๋ฆฌํจ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๊ทธ๋ค์ ์ ์์ ๋งค์ฐ ์ํ๋กญ๊ณ ์น์ ํฉ๋๋ค. ์ง๊ธ ๋น์ฅ์ ๋ ผ์ํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ป์ ํน์ ์ง๋ฌธ์ด ์๊ธฐ ๋๋ฌธ์ด ์๋๋ผ ๊ทํ๊ฐ ์์ฒญํ๊ธฐ ๋๋ฌธ์ ์ฃผ๋ก ๊ทธ๋ค๊ณผ ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. :)
๋ํ, "Flutter ํ"์ Flutter์ ๊ธฐ์ฌํ๋ ์ฌ๋๋ค์ผ ๋ฟ์ด๋ผ๋ ์ฌ์ค์ ์๊ธฐ์์ผ ๋๋ฆฝ๋๋ค. ์ผ๋ถ ๊ธฐ์ฌ์๋ Google์์ ์ผํ๊ณ ์ผ๋ถ ๊ธฐ์ฌ์๋ ํ๋ก์ ํธ ์ํคํ ์ฒ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ๋ ๊ฐ๋ ฅํ ์ญํ ์ ํ์ง๋ง ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๋ ๋ค๋ฅธ ์ฌ๋๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Flutter ํ์๋ ์์ต๋๋ค. :)
์ธ์ ๋์ฒ๋ผ -- ๊ฐ์ฌํฉ๋๋ค -- ์ด ๋ฌธ์ ๋ฅผ ๋ ผ์ํ๋ ๋ฐ ์์ด ์ธ๋ด์ฌ์ ๊ฐ๊ณ , ์ปค๋ฎค๋ํฐ์ ๊ธฐ์ฌํ๊ณ , ์ด ๊ณต๊ฐ์์ ์ฐฝ์์ ์ธ ์์ด๋์ด๋ก ํ๋ก์ ํธ๋ฅผ ๊ณ์ ์ถ์งํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
๋ช ํํ ํ์๋ฉด, ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ "๋ฒ๊ทธ"๋ ๋ณ๊ฒฝ์ผ๋ก ์ด์ด์ง ์ ์๋ ๋ชจ๋ ๊ฒ์ ์ง์นญํ๋ ์ผ๋ฐ์ ์ธ ์ฉ์ด์ ๋๋ค. ์ ์ค ์ผ์ด์ค์ผ ์๋ ์๊ณ , ์์ด๋์ด์ผ ์๋ ์๊ณ , ๋ ผ๋ฆฌ ์ค๋ฅ์ผ ์๋ ์๊ณ , ๋ฌธ์์ ์คํ์ผ ์๋ ์๊ณ , ์น ์ฌ์ดํธ์์ ํผ๋์ค๋ฌ์ด ๊ฒ์ผ ์๋ ์์ต๋๋ค.
์๋ง๋ ์ฐ๋ฆฌ๋ ํํฌ๋ก ์์ ๋ ๊ทธ๋ฌํ ๋ฌธ์ ๊ฐ ์๋ ์ฑ์ ์ ์ฒด ์๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๋ค. ํํฌ๋ก ๋ค์ ์์ฑํ ํ์๋ ์์ง๋ง ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ๊ฐ ์ผ๋ง๋ ๋๋์ง ๋ณด์ฌ์ค๋๋ค.
@satvikpendem ๋ฌธ์ ๊ฐ "๋ด ์์ฉ ํ๋ก๊ทธ๋จ์ ๋๋ฌด ๋ง์ ์์ฉ๊ตฌ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค"๋ผ๋ฉด ๊ทธ๊ฒ์ ๋ถ๋ช ํ ๋น์ ์ด ์ ๊ณ ํด์ผ ํ๋ ๋ฒ๊ทธ์ด๋ฉฐ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ ผ์ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฒ๊ทธ #๋ฅผ ์ธ๊ธํ๋ฉด โโ๋ฒ๊ทธ์ ๋ํ ๋ํ๋ฅผ ๊ณ์ํ ์ ์์ต๋๋ค.
@Hixie ๋๊ธ ๊ฐ์ฌํฉ๋๋ค. ๋ด ๋ฌธ์ ๋ @rrousselGit ์ด ์ธ๊ธํ ๊ฒ๊ณผ ๋์ผํ ๋ฒ๊ทธ(#51752)์ ์ํด ๊ด๋ฒ์ํ๊ฒ ๋ค๋ฃจ์ด์ง๋ฏ๋ก ํด๋น ๋ฌธ์ ์์ ์ฝ์ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋ ์ถ๊ฐํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@timsneath @lukepighetti ์ ๋ํ ๊ทํ์ ์๊ฒฌ์ ์ดํดํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด ๋ฌธ์ , # 51752 ๋ฐ ๊ธฐํ์ ๊ฐ์ด Flutter์ ๋งฅ๋ฝ์์ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ๋ฌด์์ ๋ ํฌํจํด์ผ ํฉ๋๊น? ์ด ๋ฌธ์ ๊ณต๊ฐ์ ๋ํด ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋๋ก ์ด๋ป๊ฒ ๋์๋๋ฆด๊น์? React ํ์ด๋ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ์ด์ผ๊ธฐ๋ฅผ ํ๋ฉด ๋น์ ์ด ๋งํ๋ฏ์ด ์ ๋ณด์ ์ ๊ฐํ ์ง๋ฌธ์ ํ ์ ์๋ ์ถฉ๋ถํ ์ง์์ ๊ฐ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด, React์ ์๋ค๊ณ ํด์ ๋ค๋ฅธ ํ๋ ์์ํฌ์์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ณต์ฌํด์๋ ์ ๋๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด ์ฝ๋ ์ค๋ณต ๋ฌธ์ ์ ๋ํ ๋ค๋ฅธ ์๋ฃจ์ ์ ๋ณด๋ ๊ฒ์ด ๋์์ด ๋ ์ ์์ต๋๋ค. Vue์ ์ค๋ฆฝ์ @yyx990803 ์ Vue์ RFC(https://www.github.com/vuejs/rfcs/tree/function-apis/active-rfcs%2F0000-function-api.md)์ ์์ ์ ์๊ฐ์ ๊ฒ์ํ์ฌ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ง๋๊ฐ ๋ค. ์ด๋ค ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋์ง, ๊ทธ๋ฆฌ๊ณ ํด๋์ค ๊ธฐ๋ฐ API์ ๋ํด ์ ์คํ๊ฒ ๋์ํ์ง ์๋ ์ด์ ์ ๋ํ ์น์ ์ ํน๋ณํ ์ดํด๋ณด๋ ๊ฒ์ด ์ ์ฉํฉ๋๋ค.
@Hixie ๋ฅผ ๋ช ํํ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ '๋ฒ๊ทธ'์ ๋ํ ๋ ๋์(๋ด๋ถ์ ์ผ๋ก?) ์ ์๋ฅผ ์คํดํ์ต๋๋ค.
@timsneath ํ๋ก์ฐํ๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๋ฏธ ์ผ๋ จ์ ๋ฌธ์ ๋ฅผ ์๋ณ ๋ฐ ์ ๋ฌํ ํต์ฌ ๋ฐ์ ๊ฐ๋ฐ์ ๊ทธ๋ฃน์ธ ๋ ๋ค๋ฅธ ๊ทธ๋ฃน์ ์ฌ๋๋ค์ ๊ตฌ์กฐ์ ์ผ๋ก ์ ์ฌํ ํ๋ ์์ํฌ์์ ์๋ฃจ์ ์ ๋ง๋ค์์ผ๋ฉฐ ์ฌ๋ฌ ํ๋ ์์ํฌ์ ๊ฑธ์ณ ๋ง์ ํ๋ฐํธ ์๋ ํ์ด ์ฑ๊ณต์ ๋ณด๊ณ ํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ด "๋ฌธ์ ์ด์ ์ ์๋ฃจ์ " GitHub ๋ฌธ์ ๋ผ๋ ํ์๋ ์์ต๋๋ค. @Hixie ๋ ํด๊ฒฐํด์ผ ํ ๋ฌธ์ ๊ฐ ์๋ค๋ ๋ฐ ๋์ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฉฐ, ์ด๋ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ด์ ์ ๋ฐ์ํ์ง ์๋ ์คํ์ผ ๋๋ ์ ์ง ๊ด๋ฆฌ ์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค. ์ด RFC์ ๋ํ ๊ฑฐ๋ถ๊ฐ์ด ์ด๋์ ์ค๋์ง ์ดํดํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ฉด์ ์ต๋ํ์ ์กด๊ฒฝ์ฌ์ ํํฉ๋๋ค.
๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ต๋ฌด์ ๊ธฐ๋ฅ์ ๊ถ์ฅํ์ง ์์ง๋ง ํํฌ์ ๋ํ RFC๋ ์ ๋นํ ๊ทผ๊ฑฐ๊ฐ ์๋ ์ ํ ๊ธฐ์ ์ด ์๋ ๊ฒ์ ์๋๋๋ค. ์ ํ ๊ธฐ์ ์ ํต์ฌ ๋ฐ์ ํ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ฐ๋ฆฌ๊ฐ ์ ์ํ๋ ๋ชจ๋ ์ ๋น์ฑ์ ๊ทธ๋ค์ด ํ ์ ์๊ณ ์ ๋ฌํ ๊ฒ์ ๋ฐ๋ณตํ ๊ฒ์ ๋๋ค. @rrousselGit ์ GitHub ๋ฌธ์ ์์ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์ฃผ์ ์ ๋ํด ๋ ผ์ํ๊ธฐ ์ํด ํ์๋ฅผ ์ฃผ์ ํ๋ ๊ฒ์ ์นํธํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฉํ ๋ฌธ์ ๋ก์ ๊ฐ์ธ์ ์ผ๋ก ์ปค๋ฎค๋ํฐ์์ ์ ์ํ flutter/flutter
๋ก๋๋งต์ ๊ด๋ฒ์ํ RFC๋ฅผ ํตํฉํ๋ ๊ตฌ์ฒด์ ์ธ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ฉด ๋์์ด ๋ ๊ฒ์
๋๋ค. ํ๋ค๊ณ ํ์ํ ์์
์ ์ํ๋ ๊ฒ์ ์ธ๋ถ ์ดํด๊ด๊ณ์๋ผ๋ ๋ง์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ค์ ํฌํจํ๊ณ ์ง์งํ๊ฒ ๋ฐ์๋ค์ฌ์ผ ํฉ๋๋ค. flutter/flutter
์ปจํ
์คํธ์์ ์ธ๋ถ๋ ๋น ํ, ๋น Google, ๋น GDE์
๋๋ค.
Wiki์ RFC ํ๋ก์ธ์ค ๋ฅผ ๋ฌธ์ํํ์ต๋๋ค.
Flutter/flutter์ ๋งฅ๋ฝ์์ ์ธ๋ถ๋ ๋น ํ, ๋น Google, ๋น GDE์ ๋๋ค.
์ ์์ ๋ฐ๋ฅด๋ฉด RFC๋ฅผ ์ ์ถํ๋ ๊ฒฝ์ฐ ํ์ ๊ตฌ์ฑ์์ ๋๋ค.
๋ด ๋ฌธ์ ๋ @rrousselGit ์ด ์ธ๊ธํ ๊ฒ๊ณผ ๋์ผํ ๋ฒ๊ทธ๋ก ๊ด๋ฒ์ํ๊ฒ ๋ค๋ฃจ์ด์ง๋๋ค(#51752).
๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ ํด๋น ํ ๋ก ์ ์ฐธ์ฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด ํน์ ๋ฌธ์ ๋ ๋ซํ ์์ง๋ง ๊ทธ ๋ฌธ์ ๋ ์ด๋ ค ์์ต๋๋ค. ๊ทธ ๋ฌธ์ ์ ๋ํ ์ ์์ ๋ํ ๋ช ๊ฐ์ง ์ค๋ช ์ด ์์์ง๋ง ์๋ฌด ๊ฒ๋ ์ ๋๋ก ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. "ํํฌ"์ ๋ํ ๋ช ํํ ์ค๋ช ์ ์์ง ์์ผ๋ฉฐ ๊ทธ๋ฅ ์ง๋์น ์ ๋๋ก๋ง ์ธ๊ธ๋์์ต๋๋ค.
๋๋ ์ฌ์ ํ ๋ฌธ์ ์ ์ ์๋ ์๋ฃจ์ ์ด React์ Vue์ ์ํด ๋งค์ฐ ๋ช ํํ๊ฒ ๋ฌธ์ํ๋์ด ์๋๋ฐ ์ ์ฐ๋ฆฌ๊ฐ ๋ฌธ์ ๋ฅผ ์ค๋ช ํด์ผ ํ๋์ง ์ดํดํ์ง ๋ชปํฉ๋๋ค.
ํํฌ์ RFC ์๋ ๋ง์ ๋๋ํ ์ฌ๋๋ค์ ์ฝ 1400๊ฐ์ ๋๊ธ, ์๊ฐ ๋์์, ๋ฌธ์ ๋ฐ ๊ธฐ์ฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋์ํ์ง ์์ ์ ์์ต๋๋ค. ํ์ง๋ง ๋ฌธ์ ๋ฅผ ์ค๋ช ํ ํ์๊ฐ ์์ด์ผ ํฉ๋๋ค
๋ฌธ์ ๋ #51752์ ์ค๋ช ๋์ด ์์ง ์์ต๋๊น? ๊ทธ๊ฒ ๋ฌธ์ ๊ฐ ์๋๊ฐ์?
(์ด์ : ๊ฐ๋ฐํ์ด ๋ค๋ฅธ ์ ํ์ ๋ํด 1400๊ฐ์ ๋๊ธ์ด ๋ฌ๋ฆฐ RFC๋ฅผ ์ง์ํ๋ ๊ฒ์ ํด๋น ๊ฐ๋ฐํ๊ณผ ํจ๊ณผ์ ์ธ ์์ฌ ์ํต ๋ฐฉ๋ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ ๊ฐ ๋๊ฐํ๊ฒ ๋๊ปด์ง๋ค๋ฉด ์ฃ์กํฉ๋๋ค.)
๋ฉ๊ฐ ์ค๋ ๋๋ฅผ ํํด์ ์ฃ์กํฉ๋๋ค. https://github.com/flutter/flutter/issues/51752#issuecomment -665380355์์ React ๊ด์ ์์ ๋ช ๊ฐ์ง ์๊ฐ์ ๋ ๋จ๊ฒผ์ผ๋ฉฐ ๊ธฐ๊บผ์ด ๋ต๋ณํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๊ทธ๊ฒ์ด ์ ์ฉํ๋ค๋ฉด ๋ ๋ง์ ์ง๋ฌธ.
๋๋ ๋ํ ์ด(๋ฐ ๊ด๋ จ ์ค๋ ๋)๊ฐ "React์์ ์๋ํฉ๋๋ค"์ ๊ฐ์ ์ฃผ์ฅ์ผ๋ก ์ ์ง ๊ด๋ฆฌ์์๊ฒ ์๋ ฅ์ ๊ฐํ์ง ์๊ณ ์ ์คํ๊ฒ ์ ์ง๋ ์ ์๋ค๋ ํฌ๋ง์ ํํํ๊ณ ์ถ์์ต๋๋ค. React์ Flutter๋ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์์ ์๋นํ ์ฐจ์ด๊ฐ ์์ผ๋ฉฐ React Hooks๋ ํนํ ์ฐ๋ฆฌ์ ์ฝ๊ฐ์ ๋์์ค์ ์๋นํ ์์กดํฉ๋๋ค. ๊ทธ๋ค์ ๋ํ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ง์ ์ฌ๋๋ค์ด ๋ฐ์๋ค์ด์ง ์์ ์ ์๋ ๋ช ๊ฐ์ง ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
ํํฌ์ ๋ํ ์๊ฐ์ด ๋ฐ๋์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ๋ค์ด ํ์์ ์ธ ํจํด์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ๋ฐฉ๊ธ React Native ๊ณ์ฝ์ ๋ง์ณค๊ณ ํํฌ๊ฐ (๋ด ์๊ฐ์) ๊ฐ๋ฐ ์์คํ ์ ๋์ฐํ๊ฒ ํํธํํ์ฌ ๊ฑฐ์ ์ด๋์ ๋ณด์ง ๋ชปํ์ต๋๋ค. Flutter๋ ํ์ฌ React ํด๋์ค ๊ตฌ์ฑ ์์์ ๋งค์ฐ ์ ์ฌํ ํจํด์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ์๋ง์ ๋๊ตฌ๊ฐ ์์ต๋๋ค. ํ๋ ์์ํฌ๊ฐ ๊ธฐ๋ณธ ์ํ ๊ด๋ฆฌ ์๋ฃจ์ ์ผ๋ก ํํฌ๋ก ์ ํ๋๋ ๊ฒฝ์ฐ Flutter ๊ฐ๋ฐ์๊ฐ ๊ฑฐ์ ์ด๋์ ์ํด ์ฌ์ฉํ์ง ์๋ ๊ธฐ์กด ์์ ๊ณผ ์ ์ ์ ํจํด์ ๋ชจ๋ ํ๊ดดํ ๊ฒ์ ๋๋ค.
ํํฌ๊ฐ ์์ฐ์ ์ธ ๊ฐ๋ฐ์ ์ํ ์ฐ์ํ ํจํด์ด๋ผ๋ ์ฃผ์ฅ์ด ์๋ค๊ณ ์๊ฐํ์ง๋ง, ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ผ๊ด์ฑ์ด "๋ ๋์" ๊ฒ๋ณด๋ค ๋ซ๋ค๋ ๋ ์ค๋๋ ฅ ์๋ ์ฃผ์ฅ(dartfmt ํต์ฌ ์ฃผ์ฅ๊ณผ ๊ฐ์)์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ํ ์๋ก์ด React ๊ฐ๋ฐ์๋ฅผ ๋ค๋ฃฐ ๋ ์๊ธฐ์น ์์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ํํฌ๊ฐ ์๋ ์ฅ์ ๋ฌผ์ ์์ฃผ ๋ถ๋ชํ๋ฉฐ ๋จผ์ ํด๋์ค ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ๋ฅด์ณ์ผ ํฉ๋๋ค. (์ข์ ๋น๊ต๋ ์๋ก์ด ๊ฐ๋ฐ์๊ฐ map/reduce/filter/fold์ ๊ฐ์ ์์ง ๋ฐฉ๋ฒ์ ๋นํด for ๋ฃจํ๋ฅผ ์ฌ์ฉํ๋ ์๊ฐ์ด ๋ ์ฝ๋ค๋ ํ์์ ๋๋ค). ํํฌ๋ ๊ณ ๊ธ ํจํด์ด๋ฉฐ ๋๋๋ก ์ด๋ฅผ ๋น์ฐํ๊ฒ ์ฌ๊น๋๋ค. ์ฌ๊ธฐ์ ์ค๋ง์ค๋ฌ์ด ์ ์ React ์ปค๋ฎค๋ํฐ๊ฐ ํด๋์ค ๊ตฌ์ฑ ์์ ํจํด์ ๋ํ ๋ฌธ์ ๋ฐ ์ง์์ ์ ์ํ๊ฒ ๋จ๊ณ์ ์ผ๋ก ์ค๋จํ์ฌ ์๋ก์ด ๊ฐ๋ฐ์์๊ฒ ์ด ๊ต์ก ๋๋ ์ต์ ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ ์ด๋ ต๊ฒ ๋ง๋ค๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ค๋ฅธ ๋ฌธ์ #51752์์ ํํฌ ์์ฒด์ ๋จ ํ๋ฒ์ ๋ ๋๋ง์ ์ํ useEffect(() => ..., [] )
ํจํด๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋จ์ ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋ Flutter ์ ์ฉ ๋ฒ์ ์ ๋ง๋๋ ์์
์ ํด์ผ ํ๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. @Hixie ๋ ํํฌ์ ์ ์ฌํ ์์
์ ์ํํ์ง๋ง ์ด๋ฌํ ๋จ์ ์ด ์์ ์ ์๋ Property ๋ฐ PropertyManager ํจํด์ผ๋ก ํฅ๋ฏธ๋ก์ด ๋ฒ์ ์ ๋ง๋ค์์ต๋๋ค. ์ ์ด๋ Flutter์ ๊ฒฝ์ฐ์๋ React ์คํ์ผ ํํฌ๋ณด๋ค ๋ ์ ์๋ํ์ง๋ง ์ฌ์ ํ ๋์ผํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฌด์ธ๊ฐ๊ฐ ์๋ ๊ฒ์ฒ๋ผ ๋๋ผ๊ธฐ ๋๋ฌธ์ ํํฌ์ ๋ํ ๋์์ ๋ ์ดํด๋ด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Flutter ํ์ ๋๊ตฐ๊ฐ๊ฐ Hooks์ ๋ํด 1:1 ์ฑํ ์ ํ๊ณ ์ถ๋ค๋ฉด, ์ ๋ ์ฐ๋ฆฌ๊ฐ React์์ Hooks๋ฅผ ์ฑํํ ์ด์ ์ ๋ํ ์ญ์ฌ์ , ๊ธฐ์ ์ ๋งฅ๋ฝ์ ์ค๋ช ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ์ด ์๊ฒฌ๋ ํฅ๋ฏธ๋ก์ธ ์ ์์ต๋๋ค. https://github.com/reactjs/rfcs/pull/68#issuecomment -439314884.