ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์ ํ ๋จ์ด๋ก ํํํ์๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค “์ํ ๊ด๋ฆฌ”. ์ค๋์ Flutter๊ฐ ์ํ๊ด๋ฆฌ๋ฅผ ํ๋ ๋ฒ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ด๋ฒ ๋ด์ฉ์ Flutter์ UI ์๋๋ฐฉ์์ ๋ํด์ ์๋ชจ๋ฅด์๋ฉด ์ดํด๊ฐ ์ด๋ ค์ฐ์ค ์ ์์ต๋๋ค. ๋ง์ฝ ์ ๋ชจ๋ฅด์ ๋ค๋ฉด ๋จผ์ Flutter UI ์๋๋ฐฉ์์ ๋ํด ๊ณต๋ถํด์ฃผ์ธ์
Flutter / 3ํ : Flutter์ UI์ ๊ดํ์ฌ
๋ชฉ์ฐจ
- ์ ์ธ์ UI ๋ฐฉ์(Declaratively UI Programming)
- Ephemeral(์์) State Vs. App State
- Provider๋ฅผ ํตํ AppState๊ด๋ฆฌ
- ๋ง์น๋ฉด์
์ ์ธ์ UI ๋ฐฉ์
Flutter์ ์ํ๊ด๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ Flutter์ UI ์์ฑ๋ฐฉ๋ฒ์ธ ‘์ ์ธ์ UI ๋ฐฉ์’์ ๋ํด ์ดํดํด์ผ ํฉ๋๋ค. ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ์๋ฉด ‘์ ์ธ์ UI ๋ฐฉ์’์์๋ UI ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ , UI ๊ฐ์ฒด์ ๋ํ ์ค๊ณ๋๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด Framework๊ฐ ์ค๊ณ๋๋ฅผ ๋ฐํ์ผ๋ก UI ๊ฐ์ฒด์ ์์ฑ, ๊ด๋ฆฌ๋ฅผ ์ ๋ถ ์ฒ๋ฆฌํด์ค๋๋ค. ์ฆ ์ฐ๋ฆฌ๋ UI ๊ฐ์ฒด์ ์ธ์ธํ ์์์ ๋ํด์ ์ ํ์์์ด ์ค๊ณ๋๋ง ์์ฑํ๋ฉด ๋๋ ๊ฒ ์ ๋๋ค.
ํ์ง๋ง UI ๊ฐ์ฒด ์์ฑ, ๊ด๋ฆฌ๋ฅผ Framework๊ฐ ์ฒ๋ฆฌํด์ค๋ค๋ฉด UI ๋ณ๊ฒฝ์๋ ์ด๋ป๊ฒ ๋์ฒํด์ผ ํ ๊น์? UI ๊ฐ์ฒด๋ฅผ ๊ฐ๊ณ ์์ง ์์ผ๋ ์ง์ UI๊ฐ์ฒด์ ์ ๊ทผํ์ฌ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ‘์ ์ธ์ UI ๋ฐฉ์’์์๋ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋ ํด๋น ๋ณ๊ฒฝ์ ๋ง์ถ์ด ์๋ก์ด UI ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ด์ ์ด ๋ค์ ์๊ธฐํ Flutter์ ์ํ๊ด๋ฆฌ์์ ํด๋น ๊ฐ๋ ์ ๋ํด์ ๋ช ๋ฃํ๊ฒ ์ดํดํ์ค ์ ์์ ๊ฒ ์ ๋๋ค. ๋ง์ฝ ์ดํด๋ฅผ ๋ชปํ์ จ๋ค๋ฉด, ์๋์ ๋ด์ฉ์ ๋ณด๊ณ ๋ค์ ๋ณด๋ฉด ์ดํด๊ฐ ๋ณด๋ค ์ฌ์ฐ์ค ๊ฒ๋๋ค.
์ข ๋ ์์ธํ ์ค๋ช ์ ์ํ์๋ ๋ถ์ ์๋์ ๊ธ์ ์ฝ์ด์ฃผ์ธ์ :)
Flutter ๊ณต์๋ฌธ์ (์ ์ธ์ UI ๋ฐฉ์)
Ephemeral(์์) State Vs. App State
Flutter์๋ ํฌ๊ฒ ๋ ๊ฐ์ง์ ์ํ๊ฐ ์กด์ฌํฉ๋๋ค. Ephemeral State, App State ์ด ๋์ ๋ํด์ ์ด์ ๋ถํฐ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ ๋ถํฐ๋ Flutter์ UI ์๋๋ฐฉ์(Widget, Stateless Widget, Stateful Widget, etc..)์ ๋ํด์ ๋ช ํํ ์ดํดํ์ ์ผ ํฉ๋๋ค.
1. Ephemeral(์์) State
Ephemeral State(UI State, Local State)๋ ๋จ์ผ ์์ ฏ์ ๊น๋ํ๊ฒ ํฌํจํ ์ ์๋ ์ํ์ ๋๋ค. ์ ์๊ฐ ๊ต์ฅํ ์ถ์์ ์ด๊ณ ๋ชจํธํ๋ฐ ์ด๊ฒ์ ์ผ๋ถ๋ก ์ด๋ ๊ฒ ์ ์ํ ๊ฒ์ด๋ผ๊ณ ํฉ๋๋ค. ์๋ง ์ ํํ ํ ๊ฐ์ง๋ก ์ ์ํ๊ธฐ ์ด๋ ค์ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ ๊ธฐ์ ์ดํด๋ฅผ ๋๊ธฐ์ํด ๋ช ๊ฐ์ง์ ์์๋ฅผ ๋ค๊ฒ ์ต๋๋ค.
1. ํ์ฌํ์ด์ง์ PageView
2. ๋ณต์กํ ์ ๋๋ฉ์ด์ ์ ํ์ฌ ์งํ ์ํฉ
3. ํ์ฌ ์ ํ๋ BottomNavigationBar
๋์ถฉ ๊ฐ์ด ์ค์๋์? ์์ ํด๋น๋๋ ๊ฒ์ StatefulWidget๋ค์ ํด๋น๋๋ ๋ด์ฉ๋ค์ ๋๋ค. ๊ตณ์ด ํด๋น StateFulWidget์ธ์ ๋ค๋ฅธ Widget๋ค์ด ์ ํ์๊ฐ ์๋ ์ํ๋ค์ ๋๋ค. ์์ Ephemeral State(UI State, Local State)์ ์ ์๊ฐ ๊ธฐ์ต๋์๋์? “๋จ์ผ ์์ ฏ์ ๊น๋ํ๊ฒ ํฌํจํ ์ ์๋ ์ํ”
2. App State
App State(Application State, Shared State)๋ Ephemeral State ์๋ ๋ค๋ฅด๊ฒ ์ฑ์ ์ฌ๋ฌ๋ถ๋ถ์์ ๊ณต์ ํ๊ณ ์ฌ์ฉ์ ์ธ์ ๊ฐ์ ์ ์ง๋์ด์ผํ๋ ์ํ์ ๋๋ค. ์ค๋ช ์ด ๋ํดํ๋ฐ ์๋์ ์์๋ฅผ ๋ณด์๋ฉด ์ดํด๊ฐ ์ฌ์ฐ์ค ๊ฒ ์ ๋๋ค.
1. ์ฌ์ฉ์ ํ๊ฒฝ์ค์
2. ๋ก๊ทธ์ธ ์ ๋ณด
3. ์ ์ ์๊ฑฐ๋ ์ฑ(์ฟ ํก)์ ์ฅ๋ฐ๊ตฌ๋
4. ๋ด์ค ์ฑ์ Read/Unread State
App State๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ค์ ์ฑํฐ์ธ Provider๋ฅผ ์ด์ฉํ ์ํ๊ด๋ฆฌ์์ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
3. Ephemeral(์์) State, App State ์ฌ์ฉ ๊ท์น
๊ณผ์ฐ ์ด๋จ๋ Ephemeral State๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋จ๋ App State๋ฅผ ์ฌ์ฉํด์ผํ๋์ง์ ๊ดํ ๋ช ํํ ๊ท์น์ด ์์๊น์? ์ ๋ต์ ‘์๋ค’์ ๋๋ค. ์ด์ ๋ํด Redux์ ๊ฐ๋ฐ์์ธ Dan Abramov ๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
“๋ ์ด์ํ ๊ฒ์ ํ์ญ์์ค”
์ค๋ช ์ด ๋ถ์กฑํ์ ๋ถ์ ์๋์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์
Flutter ๊ณต์๋ฌธ์ (Differentiate between ephemeral state and app state)
Provider๋ฅผ ์ด์ฉํ App State๊ด๋ฆฌ
Provider๋ App State๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด Flutter์์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Provider์ธ์๋ (Redux, Rx, Hook)๋ฑ์ ์ฌ์ฉํ ์ ๋ ์์ง๋ง ๋ณ๋ค๋ฅธ ์ด์ ๊ฐ ์๋ค๋ฉด Flutter์์ ์ง์ํด์ฃผ๋ Provider๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ข์ต๋๋ค. ๊ทธ๋ผ ์ง๊ธ๋ถํฐ Provider์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Provider์๋ ์ฌ๋ฌ๊ฐ์ง์ ์์๊ฐ ์กด์ฌํ์ง๋ง, ๊ฐ์ฅ ๋ํ์ ์ธ ๊ฒ 4๊ฐ์ ๋ํด์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1. ChangeNotifer
2. ChangeNotiferProvider
3. Consumer
4. Provider.of
๊ฐ๊ฐ ์์๋ค์ ๋ํด์ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Provider๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ pubspec.yaml์ ๋ค์๊ณผ ๊ฐ์ ์์กด์ฑ์ ์ถ๊ฐํด์ผ ๋ฉ๋๋ค. (์์ ์ฝ๋๋ฅผ ์ณ๋ณด๊ณ ์ถ์ผ์ ๋ถ๋ค์ ์ํด)
dependencies:
flutter:
sdk: flutter
provider: ^3.0.0 // ์ถ๊ฐํด์ฃผ์ธ์
dev_dependencies:
1. ChangeNotifier
๋ง๊ทธ๋๋ก ๋ณ๊ฒฝ์ฌํญ์ ์๋ฆด ์ ์๋ ํด๋์ค์ ๋๋ค. notifyListener()๋ฅผ ์ฌ์ฉํ๋ฉด ChangeNotifier๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ Listener์๊ฒ ๋ณ๊ฒฝ์ฌํญ์ด ์ ๋ฌ๋ฉ๋๋ค. ์ง๊ธ์ ์ ์ดํด๊ฐ ์๋์ค ์ ์์ผ๋, ๋๋จธ์ง(ChangeNotifierProvider, Consumer)๋ฅผ ์ดํด๋ณด๊ณ ๋ ํ์๋ ์ดํดํ์๋๊ฒ ๋ณด๋ค ์ฌ์ฐ์ค ๊ฒ ์ ๋๋ค. ๋ง์ฝ Reactive Porgramming ํน์ Observer Pattern์ ๋ํด์ ์๊ณ ๊ณ์ ๋ถ๋ค์ ์ต์ํ์ ๊ฐ๋ ์ด๋ผ ์ดํดํ๊ธฐ ์ฌ์ฐ์ค ๊ฒ ์ ๋๋ค. ์๋๋ ์ดํด๋ฅผ ๋๊ธฐ์ํ ์์ ์ฝ๋์ ๋๋ค.
class CartModel extends ChangeNotifier { // ChangeNotifier๋ฅผ ์์ํจ
CatalogModel _catalog;
final List<int> _itemIds = [];
CatalogModel get catalog => _catalog;
set catalog(CatalogModel newCatalog) {
_catalog = newCatalog;
notifyListeners(); // ๋ณ๊ฒฝ์ฌํญ์ ๊ตฌ๋
ํ๊ณ ์๋ ๋ฆฌ์ค๋์๊ฒ ์ ๋ฌํจ
}
List<Item> get items => _itemIds.map((id) => _catalog.getById(id)).toList();
int get totalPrice =>
items.fold(0, (total, current) => total + current.price);
void add(Item item) {
_itemIds.add(item.id);
notifyListeners();
}
}
์ถ๊ฐ์ ์ผ๋ก ChangeNotifier๋ flutter:foundaition์ ์๊ณ higher-level classes(๊ณ ์์ค ํด๋์ค : Widget, etc,,) ์ ์์กด์ฑ์ด ์์ด์ ํ ์คํธํ๊ธฐ๊ฐ ์ฝ๋ค๊ณ ํฉ๋๋ค. ๋ง์ฝ Widget๊ณผ ๊ฐ์ ๋ณต์กํ ํด๋์ค(Widget ์์ฑ, ๊ด๋ฆฌ ์ฝ๋ ๋ฑ๋ฑ)๋ฅผ ์์ํ๊ฑฐ๋ ์๊ณ ์์ผ๋ฉด ํ ์คํธํ๊ธฐ๊ฐ ์ด๋ ต๊ฒ ์ฃ ,,, ์๋๋ ๊ฐ๋จํ ๋จ์ ํ ์คํธ์ ๋๋ค.
test('adding item increases total cost', () {
final cart = CartModel();
final startingPrice = cart.totalPrice;
cart.addListener(() {
expect(cart.totalPrice, greaterThan(startingPrice));
});
cart.add(Item('Dash'));
});
2. ChangeNotifierProvider
ChangeNotifierProvider๋ ChangeNotifier๋ฅผ ํ์ ํญ๋ชฉ์ ์ ๊ณตํ๋ ์์ ฏ์ ๋๋ค. ์๊น์ ์ ChangeNotifier๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ Listener์๊ฒ ๋ณ๊ฒฝ์ฌํญ์ด ์ ๋ฌ๋๋ค๊ณ ํ์์ต๋๋ค. ChangeNotifierProvider๋ ํ์ ํญ๋ชฉ๋ค์๊ฒ ChangeNotifier๋ฅผ ์ ๊ณตํ์ฌ ๊ตฌ๋ ํ ์ ์๋๋ก ํด์ค๋๋ค.
๋ค์์ ChangeNotifierProvider๋ฅผ ์ ์ํ๋ ์ฝ๋์ ๋๋ค.
void main() {
runApp(
ChangeNotifierProvider( // ์ฌ๊ธฐ์ ์ง์ค
create: (context) => CartModel(),
child: MyApp(),
),
);
}
ChangeNotifierProvider๋ ๋๋ํด์ CartModel์ Instance๋ฅผ ์ ๊ด๋ฆฌํด์ค๋๋ค. CartModel์ Instance๋ฅผ ๊ตณ์ด ๋ค์ rebuild ํ ํ์๊ฐ ์๊ณ , dispose() ๋ํ ChangeNotifierProvider๊ฐ ์ ์ ํ ์์ ์(CartModel์ด ๋ ์ด์ ํ์์์๋)์๋์ผ๋ก ํธ์ถํด์ค๋๋ค. ํ ๋ฌธ์ฅ์ผ๋ก ๋งํ์๋ฉด ChangeNotifierProvider์์ ์์ฑํ ChangeNotifier(CartModel)์ ์ดํ์ ์ ๊ฒฝ์ธ ํ์์์ต๋๋ค.
์์ ์์ ๋ ๋จ ํ๊ฐ๋ง์ ChangeProvider๋ฅผ ์ ์ธํ์๋๋ฐ์. ๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฌ๊ฐ์ ChangeProvider๋ฅผ ์ ์ธํ ์ ๋ ์์ต๋๋ค.
void main() {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create:(context) => CartModel()),// 1
Provider(create: (context) => SomeOtherClass()), // 2
],
child: MyApp(),
),
);
}
3. Consumer
๋๋์ด ChangeNotifier๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ Listener ๊ตฌ๊ฐ๊น์ง ๋๋ฌํ์ต๋๋ค. Consumer๋ ChangeNotifierProvider์์ ํ์ ํญ๋ชฉ์์ ChangeNotifier์ ์ ๊ทผํ ์ ์๊ฒ ํ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
return HumongousWidget(
child: AnotherMonstrousWidget(
child: Consumer<CartModel>( // ์ฌ๊ธฐ์ ์ง์ค
builder: (context, cart, child) {
return Text('Total price: ${cart.totalPrice}');
},
),
),
);
์ฐ๋ฆฌ๊ฐ ์์์ ์ ์ํ๋ ChangeNotifier์ ์ด๋ฆ์ CartModel์ ๋๋ค. ๋ฐ๋ผ์ Consumer<CartModel> ๊ณผ ๊ฐ์ด ํ๊ธฐํฉ๋๋ค. ๊ทธ ๋ค์ ๋์ ๋ค์ด์ค๋ ๊ฒ์ builder ํจ์์ ๋๋ค. Consumer ์์ ฏ์ ์ ์ผํ ํ์ ์ธ์๊ฐ ๋ฐ๋ก builder ํจ์์ ๋๋ค. builderํจ์๋ 3๊ฐ์ง์ ์ธ์๋ก ์๋ํฉ๋๋ค.
- context
- ๋ชจ๋ buildํจ์๋ context๋ฅผ ์ธ์๋ฅผ ๊ฐ์ง๋๋ค.
- ChangeNotifier
- ์ฐ๋ฆฌ๊ฐ ์ ์ํ ChangeNotifier(CartModel)์ ๋๋ค. ChangeNotifier์ ๋ฐ์ดํฐ๋ฅผ ํตํด์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ Widget์ ์์ฑํ ์ ์์ต๋๋ค.
- child
- ์ด๋ฆ ๊ทธ๋๋ก ๊ฐ์ง๊ณ ์์๋ ์๋ธํธ๋ฆฌ ์์ ฏ์ ๋๋ค. ์ด๋ฅผ ์ด์ฉํด์ ๋ค์ ์๋ธํธ๋ฆฌ๋ฅผ ์์ฑํ์ง ์๊ณ ์ฌํ์ฉํ ์ ์์ต๋๋ค. ์ฆ ์ต์ ํ๋ฅผ ํ๋๋ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋๋ ํด๋น ์ฝ๋์ ๋๋ค.
Consumer<CartModel>(
builder: (context, cart, child) => Stack(
children: [
child, // ๋ค์ ์ฌ์ฉํจ
Text("Total price: ${cart.totalPrice}"),
],
),
child: SomeExpensiveWidget(),
);
์ด๋ ๊ฒ ์์ฑ๋ Consumer ์์ ฏ์ ChangeNotifier(CartModel)์์ notifyListener()๊ฐ ํธ์ถ๋๋ฉด, ์ ์ํ builderํจ์๋ฅผ ํธ์ถํ์ฌ ์๋ก์ด ์์ ฏ์ ๋ฐํํฉ๋๋ค. ์ฌ๊ธฐ๊น์ง ๋๋ฌํ์ จ๋ค๋ฉด ChangeNotifier์ ๋ํด์ ๋ณด๋ค ์ฝ๊ฒ ์ดํดํ์ค ์ ์์ผ์ค ๊ฒ ์ ๋๋ค.
4. Provider.of
Provider.of ๋ Consumer์ ๊ฐ์ด ChangeNotifier๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ Listener์ ๋๋ค. Consumer์ ๋ค๋ฅธ ์ ์ด๋ผ๊ณ ํ๋ค๋ฉด Provider.of๋ ์์ ฏ์ด ์๋๋ผ ChangeNotifier ๊ทธ ์์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์๋์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋ณด๋ค ๋ช ํํ ์ดํดํ์ค ๊ฒ ์ ๋๋ค.
class _CartList extends StatelessWidget {
@override
Widget build(BuildContext context) {
// ๊ทธ๋ฅ CartModel์ ๋ฐํํจ
var cart = Provider.of<CartModel>(context);
return ListView.builder(
itemCount: cart.items.length, // ์ฌ์ฉ ์ง์
itemBuilder: (context, index) =>
ListTile(
leading: Icon(Icons.done),
title: Text(
cart.items[index].name // ์ฌ์ฉ ์ง์
),
),
);
}
๋ง์ฝ ChangeNotifier์์ notifyListener()๊ฐ ํธ์ถ๋๋ฉด ํด๋น StatelessWidget์ build() ๋ค์ ํธ์ถํฉ๋๋ค. ๋ง์ฝ StatefulWidget ์ด๋ผ๋ฉด State.didChangeDependencies๋ฅผ ํธ์ถํฉ๋๋ค. ๊ฐ๋จํ ๋งํ์๋ฉด ํด๋น Widget์ ์ฌ๋น๋ํฉ๋๋ค.
Provider.of ์๋ ํน๋ณํ ์ฌ์ฉ๋ฒ์ด ํ๋ ๋ ์์ต๋๋ค. ๋ง์ฝ ChangeNotifier(CartModel)์ ํตํด UI๋ฅผ ๊ตฌ์ฑํ๋๊ฒ ์๋๋ผ, ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํ(removeAll() ํจ์์ ๊ฐ์ ์์ ) ํ๋ ค๊ณ ํ๋ค๋ฉด Widget์ ๋ค์ build()ํ๋ ๊ฒ์ ๋น์ฉ์ ์ํด์ด์ง ์์๊น์? ๊ทธ๋ด๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค.
Provider.of<CartModel>(context, listen: false).removeAll();
์ด๋ฐ์์ผ๋ก Provider.of ์์ lsitener ์ธ์๋ฅผ false๋ก ์ค์ ํ๊ฒ ๋๋ฉด, notifyListener()๊ฐ ํธ์ถ๋์ด๋ Widget์ด ๋ค์ build ๋์ง ์์ต๋๋ค.
์ค๋ช ์ด ๋ถ์กฑํ์ ๋ถ์ ์๋์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์
Flutter ๊ณต์ ๋ฌธ์ (์ํ๊ด๋ฆฌ ์ฑ ์ํ)
Flutter ๊ณต์ ๋ฌธ์ (Provider API docs)
FLutter ์ํ๊ด๋ฆฌ ์์ ์ฑ Github
๋ง์น๋ฉด์
Client ๊ฐ๋ฐ์ ์ด์ฉ ์ ์์ด ๊ฒฐ๊ตญ์๋ “์ํ ๊ด๋ฆฌ”๋ผ๋ ๊ฒ์ Flutter๋ฅผ ํ๋ฉด์ ๋ง์ด ๋๋ผ๊ณ ์์ต๋๋ค. ๊ฒฐ๊ตญ์ UI ์์ฒด๋ ์ํ๋ฅผ ๋ํ๋ด๋ ๊ฒ ๋ฟ์ด๊ณ , ๋คํธ์ํฌ๋ ์๋ฒ๋ก๋ถํฐ ์ํ๋ฅผ ๋ฐ์์ค๊ณ ์ ๋ฐ์ดํธ ํ๋ ๊ฒ ์ ๋๋ค. ์ฆ Client ๊ฐ๋ฐ์ ๊ทผ๋ณธ์ ‘์ํ’์ ์๋ ๊ฒ ์ ๋๋ค. ๊ทธ๋ ๊ธฐ์ ์ค๋์ ๊ธ(Flutter ์ํ๊ด๋ฆฌ)์ ์ข ๋ ์ง์คํ๊ฒ ๋๊ณ ์ฌ๋ฏธ์์๋ ํธ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
ํ๋ฆฐ ๋ถ๋ถ์ด ์์ผ๋ฉด ๋๊ธ๋ก ์ง์ ํด์ฃผ์ธ์ ใ ใ
๊ฐ์ฌํ ๋ง์์ผ๋ก ์์ ํ๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค :)
'Flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Flutter/ popUntil ์ ํ ๋ ๊ฒ์ํ๋ฉด์ด ๋ฌ๋ค๋ฉด? (0) | 2021.02.19 |
---|---|
Flutter Provider + '?' ํจํด (feat. ChangeNotifier, Mobx, BLoC, etc..) (0) | 2020.09.12 |
Dart / 1ํ : Dart์ ์ค์ํ ๊ฐ๋ (0) | 2020.07.26 |
Flutter / 3ํ : Flutter์ UI์ ๊ดํ์ฌ (0) | 2020.07.24 |
Flutter / 2ํ : Flutter ํน์ง๊ณผ ์ฅ๋จ์ (0) | 2020.07.24 |