Day 2: Variables, Control Flow & Dart 3.10 Shorthands

Transform from beginner to confident coder by mastering variables, control flow logic, and Dart 3.10 shorthands that professional developers use daily.

မင်္ဂလာပါ.. 👋

100 days of Flutter ရဲ့ ဒုတိယနေ့က ကြိုဆိုပါတယ်။ ဒီနေ့မှာတော့ dart langauge နဲ့ ပတ်သက်တာတွေကို စတင့်လေ့လာသွားပါမယ်။ ဒီနေ့ဆွေးနွေးသွားမယ့် ခေါင်းစဥ်တွေကတော့

  • What is variable?
  • Differences between var, final, and const
  • Conditional logic with if/else, ternary operator, and comparison operators
  • Dart 3.10's shorthands
  • Decision-making system

တွေပဲ ဖြစ်ပါတယ်။


What is variable?

Variable ဆိုတာကတော့ ကျွန်တော်တို့တွေ app တည်ဆောက်တဲ့အချိန်မှာ value တွေကို မှတ်ရလွယ်အောင် သိမ်းထားဖို့နဲ့ လက်ဆင့်ကမ်းပြီး အလုပ်လုပ်ဆောင်သွားနိုင်ဖို့ အသုံးပြုပါတယ်။ တချို့တွေကတော့ box လိုမျိုးနဲ့ ဥပမာပေးကြပါတယ်။ Variable define လုပ်လိုက်တာက box တခု တည်ဆောက်လိုက်တာနဲ့ အလားတူပြီး သူ့အထဲကို value တွေ ထည့်တာကတော့ assign လုပ်တာနဲ့ တူပါတယ်။

String userName;
userName = "Aung Aung";
print(userName);
  • String userName; - variable definition
  • userName = "Aung Aung"; - variable assignment
  • print(userName); - printing the result

အပေါ်မှာ ဥပမာ ပြထားတဲ့ String ဆိုတာကတော့ dart language ရဲ့ built-in support လုပ်တဲ့ type တွေထဲက တခုပဲ ဖြစ်ပါတယ်။ ဆက်ပြီးတော့ အသုံးများတဲ့ type တွေကို စကြည့်ကြရအောင်ပါ။ တခြား type တွေကို ကြုံတဲ့အခါ ဆက်ပြီးတော့ ရှင်းပြပေးသွားပါမယ်။

void main() {
  String userName = "Aung Aung";
  int age = 20;
  double height = 5.5;
  bool single = false;
  List<String> hobbies = ["football", "basketball"];

  print("$userName is $age years old, $height inches tall, and ${single ? 'single' : 'married'}.");
  print("He has ${hobbies.join(', ')} hobbies");
}

// Output:
// Aung Aung is 20 years old, 5.5 inches tall, and married.
// He has football, basketball hobbies

တကယ်လို့ definition နဲ့ assignment ကို တခါထဲတွဲလုပ်မယ်ဆို variable type ကို မသတ်မှတ်ပေးလဲ ရပါတယ်။

var userName = "Aung Aung"; // userName becomes String type
var age = 20; // age becomes int type
var height = 5.5; // height becomes double type

အပေါ်မှာ ပေးထားတဲ့ code တွေလိုက်ပြီး စမ်းချင်တယ်ဆို VS Code ထဲမှာ dart project တခုတည်ဆောက်ပြီး လိုက်လုပ်လို့ရပါတယ်။ Ctrl+Shift+P or Cmd+Shift+P ကိုနှိပ်လိုက်ရင် command palette ကို ဖွင့်လိုက်လို့ရပါတယ်။ comman palette ပွင့်လာပြီဆိုရင်တော့ dart new project လို့ ရိုက််ရှာလိုက်ရင် အောက်မှာ ပြထားသလို ထွက်လာပါလိမ့်မယ်။ တကယ်လို့ ထွက်မလာဘူးဆိုရင်တော့ extension တွေ မသွင်းရသေးလို့ ဖြစ်နိုင်ပါတယ်။ မနေ့က day 1 ရဲ့ VS Code setup လုပ်တဲ့အပိုင်းကို တချက်လောက် ပြန်ကြည့်ကြည့်လိုက်ပါ။

Dart: New Project ဆိုတဲ့ option ပေါ်လာတယ်ဆိုရင်တော့ နှိပ်ပြီးတော့ CLI Application တခု create လုပ်လိုက်ပါ။

Project name ကတော့ ကြိုက်တာပေးလို့ရပါတယ်။ ကျွန်တော်ကတော့ learn_dart ဆိုပြီး ပေးလိုက်ပါတယ်။ Project ကို ဖွင့်ပြီးရင်တော့ bin/learn_dart.dart file ရဲ့ main function ထဲမှာ အပေါ်က code ကိုထည့်ပြီးတော့ void main() ရဲ့ အပေါ်က Run ဆိုတာကို နှိပ်လိုက်ရင် အောက်မှာ ပြထားသလိုမျိုး result ကို တွေ့ရမှာပဲ ဖြစ်ပါတယ်။

အောက်မှာ ဆက်လက်ပြီး ပြသွားမယ့် code တွေကိုလဲ ဒီ main function ထဲမှာပဲ ဆက်လက်ရေးပြီးတော့ run ကြည့်သွားလို့ရပါတယ်။ auto reload လုပ်တာတွေကို ရှေ့မှာ ပြောပြပေးသွားပါမယ်။


Differences between var, final, and const

Dart langauge မှာ variable ကို သတ်မှတ်တဲ့အခါ နည်း(၃)မျိုးနဲ့ တည်ဆောက်လို့ ရပါတယ်။ အသုံးပြုပုံကွာခြားမှု အနည်းငယ်ရှိပြီး ကွာခြားချက်ကို နားလည်တဲ့အခါ code တွေကို ပိုပြီး smart ကျကျ ရေးသွားနိုင်မှာပဲ ဖြစ်ပါတယ်။

var

Variable ရဲ့ value တွေကို program run နေတုန်း ပြောင်းလဲဖို့ရှိတဲ့အခါ var keyword ကို အသုံးပြုပါတယ်။ ကျောင်းတက်စဥ်အချိန်မှာ နှစ်စဥ်နှစ်တိုင်း ခုံနံပါတ်တွေ သတ်မှတ်ပေးလေ့ရှိတာကို မှတ်မိကြမယ် ထင်ပါတယ်။ ဒီလို ခုံနံပါတ် သတ်မှတ်တာကတော့ var နဲ့ အလားတူပါတယ်။ ဒီနှစ်မှာ ခုံနံပါတ် (၁) က အောင်အောင် ဖြစ်ပေမယ့် နောက်နှစ်ကျရင် ခုံနံပါတ် (၁) က အေးအေး ဖြစ်သွားနိုင်ပါတယ်။

void main() {
  var roll1 = 'Aung Aung';
  roll1 = 'Aye Aye';
  print('Roll 1: $roll1');
}

// Output:
// Roll 1: Aye Aye

final

Program run နဲ့အချိန်မှာ တခါပဲ assign လုပ်ပြီး ပြန်ပြီး ပြောင်းလဲလို့မရအောင် လုပ်ချင်တဲ့အခါ final ကို သုံးပါတယ်။ ဒါကတော့ ဘာနဲ့တူလဲဆိုတော့ အလုပ်မှာ empoyee နံပါတ် သတ်မှတ်လိုက်တာနဲ့ တူပါတယ်။ နံပါတ်တခု သတ်မှတ်လိုက်တာနဲ့ အဲ့နံပါတ်က ပြောင်းလဲ ပြင်ဆင်လို့ မရတော့ပါဘူး။ ပြင်ဆင်ဖို့ ကြိုးစားရင် dart က ခွင့်ပြုမှာ မဟုတ်ပါဘူး။ အခုလိုမျိုး error ပြပေးနေမှာပဲ ဖြစ်ပါတယ်။

void main() {
  final employeeId = 'EMP-2026-1234';
  print("Employee ID: $employeeId");
}

const

ဒါကတော့ program အစထဲက value ကို သတ်မှတ်ထားပြီး ပြုပြင်ပြောင်းလဲတာတွေ မလုပ်စေချင်တဲ့အချိန်မှာ အသုံးပြုပါတယ်။ version number တို့၊ app theme တို့ စသဖြင့် program configuration လိုမျိုးတွေ သတ်မှတ်တဲ့နေရာမှာ အသုံးများပါတယ်။ compile time မှာထဲက value ကို သတ်မှတ်ထားတာမျိုး ဖြစ်ပြီး value ပြောင်းချင်တဲ့အခါ ထပ်ပြီးတော့ compile လုပ်ပေးဖို့ လိုအပ်မှာပဲ ဖြစ်ပါတယ်။

void main() {
  const appVersion = '1.0.0';
  const maxLoginAttempts = 3;
  print('App Version: $appVersion');
  print('Max login attempts: $maxLoginAttempts');

  const appColors = ['#FF5733', '#33FF57', '#3357FF'];
  print('app colors: $appColors');
}

// Output:
// App Version: 1.0.0
// Max login attempts: 3
// app colors: [#FF5733, #33FF57, #3357FF]

အလွယ်တကူ အောက်မှာပြထားတဲ့ table နဲ့ reference လုပ်လို့ရပါတယ်။

Keyword Reassignable? Value Set At Best Use Case
var Yes Runtime Loop counters, calculations
final No Runtime API responses, user inputs
const No Compile-time Config, themes, constants

Conditional logic with if/else, ternary operator, and comparison operators

Variable အကြောင်းတွေ သိပြီဆိုတော့ ဆက်ပြီးတော့ မတူညီတဲ့ အခြေအနေတွေကို ဘယ်လို စစ်လို့ရမလဲ ကြည့်ရအောင်ပါ။ ဒါကိုတော့ conditional logic လို့ခေါ်ပါတယ်။ if, else if, else ဆိုတဲ့ keyword တွေကို အသုံးပြုပါတယ်။ အောက်က ဥပမာတွေမှာ လေ့လာကြည့်နိုင်ပါတယ်။

///////////////////////////////
// if
// else
///////////////////////////////
void main() {
  int temperature = 35;

  if (temperature > 30) {
    print("🥵 It's hot!");
  } else {
    print('☀️ Enjoy the sunshine');
  }
}

// Output:
// 🥵 It's hot!
///////////////////////////////
// if
// else if
// else
///////////////////////////////
void main() {
  int score = 85;

  if (score >= 90) {
    print('Grade: A - Excellent! 🌟');
  } else if (score >= 80) {
    print('Grade: B - Great job! 👏');
  } else if (score >= 70) {
    print('Grade: C - Good work! 👍');
  } else if (score >= 60) {
    print('Grade: D - Needs improvement 📚');
  } else {
    print('Grade: F - Please study harder 💪');
  }
}

// Output:
// Grade: B - Great job! 👏
///////////////////////////////
// Ternary operator ( ? : )
///////////////////////////////
void main() {
  bool isSingle = false;
  print("Marital Status: ${isSingle ? 'single' : 'married'}");
}
////////////////////////////////////////////////
// Comparison Operators (==, !=, >, <, >=, <=)
////////////////////////////////////////////////
void main() {
  int a = 10;
  int b = 20;
  
  print(a == b);  // false (equal to)
  print(a != b);  // true (not equal to)
  print(a > b);   // false (greater than)
  print(a < b);   // true (less than)
  print(a >= 10); // true (greater than or equal to)
  print(b <= 20); // true (less than or equal to)
}

Dart 3.10's shorthands

အရင်က dart မှာ enum သုံးမယ်ဆို အကုန်အပြည့်အစုံရေးရလေ့ ရှိပါတယ်။ အခု dart version မှာတော့ အပြည့်အစုံ ရေးစရာမလိုတော့ဘဲ shorthand လိုမျိုးနဲ့ ရေးလို့ရသွားပါပြီ။ ဒါက Flutter widget တွေ သုံးတဲ့အခါ ပိုပြီးအသုံးဝင်တာကို တွေ့ရပါလိမ့်မယ်။

enum TravelStatus { planning, traveling, completed }

void main() {
  // Traditional approach (verbose)
  TravelStatus status1 = TravelStatus.traveling;
  Duration travelLength1 = Duration(days: 5);
  print("${status1.name} for ${travelLength1.inDays} days.");

  // Modern Dart 3.10 way (clean!)
  TravelStatus status2 = .traveling;
  Duration travelLength2 = .new(days: 5);
  print("${status2.name} for ${travelLength2.inDays} days.");
}

Decision-making system (Travel Planner)

အပေါ်မှာလေ့လာခဲ့တဲ့ logic တွေ စုပေါင်းပြီးတော့ travel planner ဆိုတဲ့ cli tool လေး စမ်းကြည့်ကြရအောင်ပါ။ ဘယ်နေရာမှာ ဘယ်လို logic တွေ သုံးထားလဲဆိုတာ ပြောနိုင်ကြလား? 😉

// bin/travel_planner.dart

import 'dart:io';

enum TravelMode {
  flight,
  train,
  bus,
  car;

  double get multiplier {
    if (this == .flight) {
      return 1.5;
    } else if (this == .train) {
      return 1.2;
    } else if (this == .car) {
      return 1.0;
    } else if (this == .bus) {
      return 0.8;
    }
    return 0;
  }
}

const appVersion = '1.0.0';
const costPerKm = 2;

void main(List<String> args) {
  print('🌏 Travel Planner');

  final planStartAt = DateTime.now();

  print('App version: $appVersion');
  print('Planning start: $planStartAt');

  stdout.write("Distance (km): ");
  final distance = int.parse(stdin.readLineSync() ?? '0');

  stdout.write('Budget (\$): ');
  final budget = int.parse(stdin.readLineSync() ?? '0');

  stdout.write('Is this urgent? (y/n): ');
  final isUrgent = stdin.readLineSync()?.toLowerCase() == 'y';

  print('\n=======================');

  TravelMode travelMode;
  String reason;

  if (distance > 500) {
    travelMode = .flight;
    reason = 'Long distance!';
  } else if (isUrgent && budget >= 3000) {
    travelMode = .flight;
    reason = 'Urgent travel with enough budget!';
  } else if (distance > 200 && budget >= 1500) {
    travelMode = .train;
    reason = 'Not too far with enough budget';
  } else if (budget < 1000) {
    travelMode = .bus;
    reason = 'Budget friendly!';
  } else {
    travelMode = .car;
    reason = 'Personal transportation';
  }

  final urgencyMessage = isUrgent ? '🏃 Urgent' : '🚶 Chill';

  final features = ['Basic Travel Package', if (isUrgent) 'Earliest booking'];

  final baseCost = distance * costPerKm;
  final estimatedCost = baseCost * travelMode.multiplier;

  print('🔖 Travel Plan');
  print('=======================');
  print('Distance: $distance km');
  print('Budget: $budget \$');
  print('Urgency: $urgencyMessage');

  print('\nℹ️  Result:');
  print('=======================');
  print('Mode: ${travelMode.name}');
  print('Reason: $reason');
  print('Estimated Cost: $estimatedCost');
  print('Features: ${features.join(', ')}');
  print(estimatedCost > budget ? '💸 Over budget' : ' 🤑 Affortable');
}

အပေါ်က code ကို run ဖို့ဆိုရင် fvm dart run bin/travel_planner.dart ဆိုပြီးတော့ run လို့ရပါတယ်။

ကိုယ်ထည့်ချင်တာလေးတွေရှိရင် ထပ်ထည့်ပြီး result ကို discord server မှာ sharing လုပ်ပေးလို့လဲ ရပါတယ်။


ဒီနေ့ Day 2 အတွက်ကတော့ ဒီလောက်ပဲ ဖြစ်ပါတယ်။ အဆုံးထိ ဖတ်ပေးတဲ့အတွက် အများကြီး ကျေးဇူးတင်ပါတယ်။ နားမလည်တာတွေ အဆင်မပြေတာတွေ ရှိခဲ့ရင်လဲ အောက်မှာပေးထားတဲ့ discord server ထဲမှာ လာရောက်ဆွေးနွေးနိုင်ပါတယ်။ နောက်နေ့တွေမှာလဲ ဆက်လက်ပြီး sharing လုပ်သွားပေးသွားမှာ ဖြစ်တဲ့အတွက် subscribe လုပ်ထားဖို့ ဖိတ်ခေါ်ပါတယ်။