๋๋ฒ์งธ๋ก๋ hook์ useMemoized function์ ๋ํด์ ์์๋ณด์.
useMemoized์ ๋ํด ๊ฐ๋จํ ์ด์ผ๊ธฐ ํ์๋ฉด, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ ์๋ค๊ฐ
๊ฐ์ด ๋ณํ๋ค๋ฉด ์ฌ๋น๋, ์๋๋ผ๋ฉด ์๋ฌด ๋ณํ๋ ์ฃผ์ง ์๋๋ค.
์ฆ oldValue(๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ๊ฐ)๊ณผ currentValue(ํ์ฌ ๊ฐ)๋ฅผ ๋๊ฐ๋ฅผ ๊ณ์ ๋น๊ตํ๋ฉด์
์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค๊ณ ์ดํดํ๋ฉด ์์ฃผ ์ฝ๊ฒ ์ดํดํ ์ ์์ ๊ฒ ์ด๋ค.
์ผ๋จ Implementation์ ๋ํด์ ์์๋ณด์.
์ธ์๊ฐ์ผ๋ก Function ํจ์์ List<Object>๋ฅผ ๋ฐ๋๋ค.
๋๋ computerExpensiveOperation์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ useMemorized๋ก ์คํํ๋๋ก ๊ตฌํํ์๋ค.
int computerExpensiveOperation(int count) {
print('useMemoized ํจ์ ์คํ');
// ์์ํ ์ ์๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ์ฐ์ฐ
return count * count;
}
๊ทธ๋ฆฌ๊ณ Widget ๋น๋์์ useMemoried๋ฅผ ์ค์ ํ์๋ค.
Widget build(BuildContext context) {
final counter = useState(0);
final state = useState(0);
// int expensiveValue = useMemoized(() => computeExpensiveOperation(state.value), [state.value]);
int expensiveValue = useMemoized(() => computerExpensiveOperation(counter.value), [state.value]);
... ๊ทธ์ธ ์ฝ๋
}
๊ทธ๋ฆฌ๊ณ floatingAction ๋ฒํผ์ ๋๋ฅด๋ฉด state๊ฐ์ด ๋ณํ๋๋ก ๊ตฌํํ์๋ค.
floatingActionButton: FloatingActionButton(
onPressed: () {
counter.value++;
if (counter.value % 5 == 0) {
// state.value;
state.value++;
}
},
์ฆ ์ฝ๋๋ก ๊ฐ๋จํ ๋ณด๋ฉด,
counter๊ฐ์ด 5์ ๋ฐฐ์์ผ ๊ฒฝ์ฐ์๋ state๊ฐ์ ๋ณํ์ํจ๋ค.
๊ทธ๋ ๊ฒ ๋๋ค๋ฉด,
๋ฅผ ํตํด์ ์ํ๋ณํ๊ฐ ๊ฐ์ง๋๋ [state.value]๋ฅผ ํตํด state๊ฐ ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก computerExpensiveOperation ํจ์๊ฐ ์คํ๋๊ณ
ํจ์๊ฐ ์คํ๋๊ณ expensiveValue ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ์ด ๋๊ณ
Text(
'Sum : $expensiveValue',
style: const TextStyle(
fontSize: 32,
fontWeight: FontWeight.bold,
),
๋ฅผ ํตํด์ Sumํจ์๊ฐ ์ต์ข ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
์คํ๋์์์ ํตํด์ ๊ฐ๋จํ๊ฒ ํ์ธํด๋ณด์!
๊ทธ๋ ๋ค๋ฉด ์ด์ ์ด๋ฐ ์๊ฐ์ด ๋ค ์ ์๋ค.
useEffect๋ ๋ญ๊ฐ ๋ค๋ฅธ๊ฑฐ์ผ? ๊ทผ๋ฐ ์ ์ฐ๊ณ ์ด๋ป๊ฒ ์ฌ์ฉํ๋๊ฑฐ์ง?
์ฌ์ค ์ ๋ชจ๋ฅด๊ฒ ๋ค. useEffect๋ useMemoried์ฒ๋ผ ์ธ ์ ์๋๋ฐ ๋ฌด์์ด ๋ค๋ฅธ ๊ฒ์ผ๊น?
๊ฒฐ๊ตญ ์ฐจ์ด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฅ์ ์๋ ๊ฒ ๊ฐ๋ค. ๋๋ ๊ณ ์ฐ์ฐ์ฒ๋ฆฌ ์์ ์ ์ฐ์ผ ์ ์์ ๊ฒ ๊ฐ๋ค.
์๋ฅผ๋ค์ด ํ๊ฐ์ง ์์๋ก Future๋ Stream๊ฐ์ ์ค์๊ฐ์ผ๋ก ๊ณ์ํด์ ๋ค์ด์ค๋ ๊ฐ์ด ์๋ค๊ณ ํ์.
๊ทธ๋ ๋ค๋ฉด ๋ง์ฝ ๋๊ฐ์ ๊ฐ์ด ์ค์๊ฐ์ผ๋ก 1000๋ฒ ๋ค์ด์จ๋ค๊ณ ํ์ ๊ทธ๋ ๋ค๋ฉด ๋ฐ์ดํฐ ๊ฐ์ด ๋๊ฐ์ผ๋ฏ๋ก
์ฌ ๋น๋๋ฅผ ํ์ง ์๊ณ ๋ค๋ฅธ ๊ฐ์ด ๋ค์ด์์ ๊ฒฝ์ฐ์๋ง ๋น๋๋ฅผ ํ ๊ฒ ์ด๋ค.
๊ทผ๋ฐ ์ฌ์ค์ ์๋ฒ์์ ๋ค์ด์ค๋ ๊ฐ์ด ๋๊ฐ์ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ผ๋... ์ค์ ๋ก ์ฌ์ฉํ ์ง๋ ์๋ฌธ์ด๊ธด ํ๋ค.
๊ทธ๋์ ChatGpt์ ๋ฌผ์ด๋ณด๋
๊ฒฐ๋ก ์ ์ผ๋ก useMemoized๋ ๋ฉ๋ชจ๋ฆฌํ๋ฅผ ํตํ ์ฌ๊ณ์ฐ๋ฐฉ์ง๊ฐ ๋ชฉ์ ์ผ๋ก ๊ฐ๋ฐ๋ ๊ฒ ๊ฐ๋ค.
์ฆ ๋ฆฌ์์ค๊ฐ ๋ง์ด ํ์ํ ๊ณ์ฐ์ผ ๊ฒฝ์ฐ์๋ useMemorized๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ข๋ค๋ ๊ฒ ๊ฐ๋ค.
์ ์ฒด ์ฝ๋
์ฝ๋ ๋ณด๊ธฐ
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
void main() {
runApp(
MaterialApp(
debugShowCheckedModeBanner: false,
home: HomeScreen(),
),
);
}
// ignore: must_be_immutable
class HomeScreen extends HookWidget {
HomeScreen({super.key});
int value = 0;
int computerExpensiveOperation(int count) {
print('useMemoized ํจ์ ์คํ');
// ์์ํ ์ ์๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ์ฐ์ฐ
return count * count;
}
@override
Widget build(BuildContext context) {
final counter = useState(0);
final state = useState(0);
// int expensiveValue = useMemoized(() => computeExpensiveOperation(state.value), [state.value]);
int expensiveValue = useMemoized(() => computerExpensiveOperation(counter.value), [state.value]);
log('Rebuild');
return Scaffold(
appBar: AppBar(
title: const Text('useState'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
counter.value.toString(),
style: const TextStyle(
fontSize: 32,
fontWeight: FontWeight.bold,
),
),
Text(
'Sum : $expensiveValue',
style: const TextStyle(
fontSize: 32,
fontWeight: FontWeight.bold,
),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
counter.value++;
if (counter.value % 5 == 0) {
// state.value;
state.value++;
}
},
child: const Icon(Icons.add),
),
);
}
}