Thuta Learning
ရှာဖွေရန်
ExercisesMobile Developmentbeginner

Exercise: Widget, Layout & State Warm-up

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Exercise: Widget, Layout & State Warm-up ကို ကိုယ်တိုင် လေ့ကျင့်ကြည့်မယ်
  • သင်ခဲ့ပြီးသား skill တွေကို practice လုပ်ပြီး ခိုင်မာအောင်လုပ်မယ်
  • အမှားရှာ၊ ပြင်တတ်၊ ကိုယ်တိုင် check လုပ်တတ်မယ်

ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်

ဒီ lesson ကတော့ အသစ်ဘာမှ မသင်ပါဘူး၊ Basic နဲ့ Intermediate chapter တွေမှာ သင်ခဲ့တဲ့ Column/Row layout, ElevatedButton, GestureDetector, TextField, StatefulWidget နဲ့ setState() ကို ပေါင်းသုံးပြီး self-practice လုပ်ဖို့ပါ။ Task တစ်ခုချင်းစီက widget tree ကို လက်တွေ့ရေးကြည့်စေပြီး, state ပြောင်းလဲမှုကို UI ပေါ်မှာ real-time မြင်ရအောင် လေ့ကျင့်ပေးပါတယ်။ ကုဒ်ကို ကူးရေးရုံနဲ့မလုံလောက်ဘဲ ကိုယ်တိုင် logic ကို စဉ်းစားပြီး ဖြည့်ရေးဖို့ လိုပါတယ်။ ဒါကြောင့် answer ကို တန်းမကြည့်ဘဲ ကိုယ်တိုင်အရင်ကြိုးစားကြည့်ပါ။

လေ့ကျင့်ခန်းများ

Task 1: Counter app တစ်ခုကို StatefulWidget နဲ့ ဆောက်ပြီး, increment button နဲ့ decrement button နှစ်ခုစလုံးထည့်ပါ (count က 0 အောက်မကျအောင် ကန့်သတ်ပါ). Task 2: Row နဲ့ Column ကို ပေါင်းသုံးပြီး profile card layout တစ်ခု (avatar circle, name Text, description Text) ကို CrossAxisAlignment, MainAxisAlignment သုံးပြီး alignment ညီအောင် စီပါ. Task 3: GestureDetector ကို သုံးပြီး Container box တစ်ခုကို tap လုပ်တိုင်း background color ကို color list ထဲက အလှည့်ကျ ပြောင်းအောင် ရေးပါ. Task 4: TextField တစ်ခုနဲ့ 'Show' button ကို ပေါင်းပြီး, user ရိုက်ထည့်တဲ့ text ကို button နှိပ်လိုက်တာနဲ့ အောက်က Text widget မှာ ပြသအောင် setState() သုံးပါ.

Code နမူနာ

dart
// Task 1 skeleton - Counter with limit
class CounterBox extends StatefulWidget {
  const CounterBox({super.key});
  @override
  State<CounterBox> createState() => _CounterBoxState();
}

class _CounterBoxState extends State<CounterBox> {
  int count = 0;

  void increment() {
    setState(() {
      count++;
    });
  }

  void decrement() {
    setState(() {
      if (count > 0) count--;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text('$count', style: const TextStyle(fontSize: 32)),
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(onPressed: decrement, child: const Text('-')),
            const SizedBox(width: 12),
            ElevatedButton(onPressed: increment, child: const Text('+')),
          ],
        ),
      ],
    );
  }
}

// Task 3 hint - color cycle
final colors = [Colors.blue, Colors.green, Colors.orange, Colors.purple];
int colorIndex = 0;
// GestureDetector onTap: setState(() { colorIndex = (colorIndex + 1) % colors.length; });
You should see
Counter widget က 0 အောက် မကျဘဲ +/- button နှစ်ခုနဲ့ အလုပ်လုပ်ပြီး, profile card, color-cycle box, TextField+Show button task တွေအားလုံး setState() ခေါ်တိုင်း UI ကို correct ပြောင်းပြပေးပါတယ်။

၅ မိနစ် စမ်းကြည့်

Task 4 ကို ဖြေပြီးရင် TextField ထဲမှာ text မရှိတဲ့အခါ 'Show' နှိပ်ရင် 'Please enter something' ဆိုတဲ့ warning Text ပြပေးအောင် condition တစ်ခု ထပ်ထည့်ကြည့်ပါ (5 minute).

သတိလေးတစ်ချက်

Task အားလုံးကို solution ကြည့်ခြင်းမပြုမီ ကိုယ်တိုင် error message ကို ဖတ်ပြီး debug လုပ်ကြည့်ပါ၊ error ကို ဖတ်တတ်တာဟာ Flutter သင်ယူရာမှာ အရေးကြီးဆုံး skill တစ်ခုပါ။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • setState() ခေါ်ဖို့ မေ့ပြီး state variable ကို တိုက်ရိုက်ပြောင်းလိုက်တာကြောင့် UI update မဖြစ်တာ
  • Row/Column ထဲမှာ children width/height limit ကို မထည့်ဘဲ Expanded/Flexible မသုံးလို့ RenderFlex overflow error တက်တာ

အခု ကိုယ်တိုင် စမ်းကြည့်

Task 4 ကို ဖြေပြီးရင် TextField ထဲမှာ text မရှိတဲ့အခါ 'Show' နှိပ်ရင် 'Please enter something' ဆိုတဲ့ warning Text ပြပေးအောင် condition တစ်ခု ထပ်ထည့်ကြည့်ပါ (5 minute).

You'll know it worked when: Counter widget က 0 အောက် မကျဘဲ +/- button နှစ်ခုနဲ့ အလုပ်လုပ်ပြီး, profile card, color-cycle box, TextField+Show button task တွေအားလုံး setState() ခေါ်တိုင်း UI ကို correct ပြောင်းပြပေးပါတယ်။

Exercise: Widget, Layout & State Warm-up | Thuta Learning