Part 5 - State Management
Part 5 - State Management
os ea
ok
or
n h K
Sa g i ut
rin So
ee s,
um
gin em am)
t
En ys S gr
of ion ele
O ter at
as m 2
(T
M orf 75
2
In 25
2
01
t
en
em
ag
3 an
M r
e
ate t
St ut
Fl
State Management
លំ នប
ំ ញ&ែដលេកត
មនជមួយ setState()
§ េនកនុង Flutter 'េ(ប Reactive Programming ែដលកនុងេនះ េពលេយង ចង់ update
ែផនកៃន UI 7មួយរបស់េយង ។ =ល់េពលេយង ចង់ដូរអ@ម
ី យ
ួ ដូចជចង់បូ រអកDរ
C បCូរពណ៌
ឬបCូរ Widget គេឺ យង
(តKវេM setState()
េដម
បឲយ'
ី build នូវ internal state
េឡង
វញ។
ិ េហយ
េយង
(តKវេ(ប setState()
េនកនុង class ែដល inherit េចញពី
StatefulWidget។ សូ មេមល ឧទហរណ៍
ៃនករេ(ប setState()៖
3
4
បញ&ជមួយ setState()
§ េបេ ទះបជ
ី setState() (ចប*ូរ UI បនែមន លុ ះ34ែត UI ទំងេនះនង
ឹ សថិតេនកនុង
class ជមួយគន។ ប៉ុែន*Eមន
ិ (ចឆGងេឆGយ
ទន
ិ ននយ
័ ែដលកនុង class េផLងគនបនេទ!
5
6
Flutter Widgets គជ
ឺ Tree
MyApp
MyButton MyText
7
State Management
8
Provider
Provider
10
Lift-up State (េលក State េឡង
េល)
3. 4មរយៈរូបខងេ3កម េយង
េឃញ
េហយ
ថ MyButton នង
ិ MyText គស
ឺ ិ ថតេនពី
េ3កម MyApp។ ដូេចនះេដម
បឲយ
ី MyButton (ចឆGងេឆGយ
ជមួយ MyText បន េយង3តfវ
េលក State (Lift-up State) មកdក់3តង់ MyApp។ ដូេចនះេយង
3តfវdក់ Provider េន
កនុង class MyApp 3តង់ចំនុចែបកែខនងរEង MyButton នង
ិ MyText៖
MyApp Provider
MyButton MyText
11
class MyScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("My Page"),
),
body: ChangeNotifierProvider(
create: (context) => CounterLogic(),
child: Container(
child: Column(
children: [
MyButton(),
MyText(),
],
),
),
),
);
}
}
12
េ7ប Provider េនកនុងWidget កូន េដមបេ>
ី State
return Expanded(
child: Center(
child: IconButton(
icon: Icon(
Icons.add_box_outlined, size: 30,
),
onPressed: () => logic.increase(),
,
),
),
);
}
}
13
class MyText extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Expanded(
child: Center(
child: Text("${logic.counter}", style: TextStyle(fontSize: 50)),
),
);
}
}
េយង
Zចសេងកតេឃញ
class ទំង២ MyButton នង
ិ MyText គប
ឺ ន extends េចញពី
StatelessWidget។ 'មនន័យ =ល់ករ update ទន
ិ ននយ
័ គ'
ឺ មន
ិ បន build េឡង
វញេទ។
ិ
14
គួរទញ variable ឬ method េចញពី Logic
15
§ ដូចគនេទនង
ឹ ករទញយក variable គេឺ យង
គួរទញEផទល់។ ប*ូរពក
ី ូដខងេ3កម៖
16
Consumer Class
17
Method របស់ context
បនទប់ពេី យង
បន import Provider េហយ
គេឺ យង
(ចេ3ប method របស់ context
បនែដរ ែដល method ទំងេនះ3សេដcងគននង
ឹ Provider៖
context.read(): E3គន់ែតផ*ល់នូវ Logic ែតEទទួលករផGស់បូ រេទ
*
(េ3បប
នែតេនេ3ក build)
context.read<CounterLogic>().increase();
Provider.of<CounterLogic>(context, listen: false).increase();
context.watch(): េពលេយង
េ3បE
េយង
នង
ឹ េធvឲ
យ Logic ផGស់បូ រ* នង
ិ ទទួលករ
ផGស់បូ រមកវ
* ញិ (េ3បប
នែតេនកនុង build)
int counter = context.watch<CounterLogic>().counter;
int counter = Provider.of<CounterLogic>(context).counter;
18
§ context.select(): េពលេយង
េ3បE
េដម
បទទួ
ី លករផGស់បូ រែតែផន
* កតូចមួយ
wមួយៃន Logic ែតប៉ុេwx ះ (េ3បប
នែតេនកនុង build)
int counter = context.select<CounterLogic, int>((cm) => cm.counter);
19
MultiProvider
§ េនេពលខGះ េយង
មន Logic េ3ចន
ជងមួយ។ ដូេចនះេយង
(ចេ3ប MultiProvider
េដម
បdក់
ី Provider ទំងេនះបន៖
import 'counter_Logic.dart';
import 'my_screen.dart';
import 'theme_Logic.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
20
import 'package:flutter/foundation.dart';
21
ProxyProvider
§ ករណីខ6ះេយង
មន Provider ២ ែដល Provider2 =+>ស័យេទ
Provider1។ ដូេចនះេយង
+ចេ>ប ProxyProvider បន ែដលេយង
េ>ប
=េដម
បបញច
ី ូ លតំៃលពី Provider មួយេទ Provider មួយេទNត។
22
import 'counter_Logic.dart';
class CounterStringLogic {
CounterLogic counterLogic;
CounterStringLogic(this.counterLogic);
//Example of Calling…
class MyStringText extends StatelessWidget {
@override
Widget build(BuildContext context) {
String counter = context.read<CounterStringLogic>().counterString;
return Expanded(
child: Center(
child: Text("$counter",
style: TextStyle(fontSize: 20, color: Colors.pink)),
),
);
}
}
23