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

Exercise: Navigation, Async & API Challenge

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

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

  • Exercise: Navigation, Async & API Challenge ကို ကိုယ်တိုင် လေ့ကျင့်ကြည့်မယ်
  • သင်ခဲ့ပြီးသား skill တွေကို practice လုပ်ပြီး ခိုင်မာအောင်လုပ်မယ်
  • အမှားရှာ၊ ပြင်တတ်၊ ကိုယ်တိုင် check လုပ်တတ်မယ်

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

ဒီ lesson က ပထမ exercise lesson ထက် ခက်ပြီး, Navigator, named routes, FutureBuilder, http package တို့ကို တစ်ပြိုင်နက် ပေါင်းသုံးရတဲ့ task တွေဖြစ်ပါတယ်။ Real app development မှာ screen တစ်ခုကနေ တစ်ခုကူးရင်း data ကို pass/return ဖြစ်ရတာ၊ network call ရဲ့ loading/error state ကို UI မှာ ကိုင်တွယ်ရတာတွေက အရေးကြီးပါတယ်။ ဒီ task တွေကို ကိုယ်တိုင်ရေးကြည့်ခြင်းအားဖြင့် mini-project lesson မှာ တွေ့ခဲ့တဲ့ concept တွေကို ခိုင်မာအောင် ပြန်လည်လေ့ကျင့်နိုင်ပါလိမ့်မယ်။ Task တစ်ခုချင်းစီအတွက် code skeleton ကို sample အနေနဲ့ ပေးထားပေမယ့် logic အပြည့်အစုံကို ကိုယ်တိုင်ဖြည့်ရပါမယ်။

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

Task 1: Named routes ('/', '/detail') ကိုသုံးပြီး Home screen ရဲ့ ListView item တစ်ခုကို tap လိုက်တာနဲ့ Detail screen ကို Navigator.pushNamed() နဲ့ item name (argument) ပါတွဲပို့ပြီး Detail screen မှာ ပြသပါ. Task 2: Detail screen ထဲမှာ 'Confirm' button တစ်ခုထည့်ပြီး Navigator.pop(context, true) နဲ့ result ကို Home screen ကို ပြန်ပို့ပါ, Home screen က result ကို await Navigator.pushNamed() နဲ့ လက်ခံပြီး SnackBar ပြပါ. Task 3: http package သုံးပြီး public API (ဥပမာ jsonplaceholder.typicode.com/users) ကနေ user list ကို async function နဲ့ fetch လုပ်ပြီး, loading အချိန်မှာ CircularProgressIndicator, success ရင် ListView.builder, error ရင် error Text ကို ပြသအောင် FutureBuilder နဲ့ ရေးပါ.

Code နမူနာ

dart
// Task 1 & 2 skeleton
class DetailScreen extends StatelessWidget {
  final String itemName;
  const DetailScreen({super.key, required this.itemName});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(itemName)),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context, true);
          },
          child: const Text('Confirm'),
        ),
      ),
    );
  }
}

// Home screen call
final result = await Navigator.pushNamed(context, '/detail', arguments: 'Item A');
if (result == true) {
  ScaffoldMessenger.of(context).showSnackBar(
    const SnackBar(content: Text('Confirmed!')),
  );
}

// Task 3 skeleton
Future<List<dynamic>> fetchUsers() async {
  final res = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/users'));
  if (res.statusCode == 200) {
    return jsonDecode(res.body);
  } else {
    throw Exception('Failed to load users');
  }
}

// FutureBuilder<List<dynamic>>(
//   future: fetchUsers(),
//   builder: (context, snapshot) {
//     if (snapshot.connectionState == ConnectionState.waiting) {
//       return const CircularProgressIndicator();
//     } else if (snapshot.hasError) {
//       return Text('Error: ${snapshot.error}');
//     } else {
//       final users = snapshot.data!;
//       return ListView.builder(...);
//     }
//   },
// )
You should see
Home screen ကနေ item တစ်ခုကို tap လိုက်ရင် Detail screen ကို argument ပါပြီး ရောက်သွားပြီး, Confirm နှိပ်ရင် Home မှာ SnackBar ပေါ်လာပြီး, user list screen က loading indicator ကနေ real API data list ကို ဖော်ပြပေးပါလိမ့်မယ်။

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

Task 3 ကို ဖြေပြီးရင် pull-to-refresh အတွက် RefreshIndicator ကို ထပ်ထည့်ပြီး, user ကို screen ကို အောက်ကနေဆွဲရင် fetchUsers() ကို ပြန်ခေါ်အောင် ရေးကြည့်ပါ (5 minute).

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

Public API တွေက rate limit ရှိနိုင်လို့ FutureBuilder ကို widget rebuild တိုင်း API အသစ်ခေါ်မယ့်အစား Future ကို state variable တစ်ခုမှာ initState() အချိန်ထဲ သိမ်းထားပြီးမှ သုံးပါ။

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

  • pushNamed() ကို await မလုပ်ဘဲ result ကို ချက်ချင်းသုံးမိလို့ null value ရလာတာ
  • FutureBuilder မှာ snapshot.hasError ကို check မလုပ်ဘဲ data ရှိမယ်လို့ယူဆပြီး snapshot.data! ကို တိုက်ရိုက်သုံးလို့ network error တက်ရင် app crash ဖြစ်တာ

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

Task 3 ကို ဖြေပြီးရင် pull-to-refresh အတွက် RefreshIndicator ကို ထပ်ထည့်ပြီး, user ကို screen ကို အောက်ကနေဆွဲရင် fetchUsers() ကို ပြန်ခေါ်အောင် ရေးကြည့်ပါ (5 minute).

You'll know it worked when: Home screen ကနေ item တစ်ခုကို tap လိုက်ရင် Detail screen ကို argument ပါပြီး ရောက်သွားပြီး, Confirm နှိပ်ရင် Home မှာ SnackBar ပေါ်လာပြီး, user list screen က loading indicator ကနေ real API data list ကို ဖော်ပြပေးပါလိမ့်မယ်။

Exercise: Navigation, Async & API Challenge | Thuta Learning