備忘錄_20160105(定位) 修改 回首頁

程式 2024-02-15 11:18:45 1707967125 100
dart 程式語言概覽

dart 程式語言概覽

dart01.dart

// dart01.dart - 在 dart 3.0.6 底下測試

// [cmd]
// dart -v --version 可得知版本

// dart 是程式語言(programming language)
// flutter 是架構(framework)

void main()
{
  for(int i=0; i<10; i++)
  {
    print('Hello, world! - ${i+1}');
  }
}

dart02.dart

void main() // 在 dart 3.0.6 底下測試
{
  var str1 = "Hello";
  String str2 = "Hello"; // 明確宣告為字串
  
  int? iCanBeNull; // 用問號代表此變數可以為 null
  iCanBeNull=16;
  print(iCanBeNull);
  iCanBeNull=null;
  print(iCanBeNull);
  if(iCanBeNull==null)
  {
    print("iCanBeNull is null now!");
  }
  
  int iCannotBeNull;
  print(iCannotBeNull);
  // 若未給定值就使用的話,會出現下面錯誤訊息。
  // Error: Non-nullable variable 'iCannotBeNull' must be assigned before it can be used.

  late int iLateVariable; // 程式設計師掛保證,一定會給予值。
  print(iLateVariable);
  // 若未給定值就使用的話(跳票了),會出現下面錯誤訊息。
  // Error: Late variable 'iLateVariable' without initializer is definitely unassigned.
}

dart03.dart

void main() // 在 dart 3.0.6 底下測試
{
  int i01=38;       // 64-bit signed non-fractional integer values
  double d02=77.35; // 64-bit double-precision floating-point number
  BigInt bi03=BigInt.from(654897652351321); // 超大整數,上限是 RAM 的大小...
  bool boo04=true;
  
  List list05=[];
  list05.add("Hello,");
  list05.add("World!");
  print(list05.length); // 2
  
  List list06=[4,5,6];
  list06.add("7-seven");
  list06.add("8-eight");
  list06.remove("7-seven");
  print(list06.length); // 4
  
  List list07fixed=List.filled(3, "really");

  list07fixed[2]="can be modified";
  print(list07fixed[0]);
  print(list07fixed[1]);
  print(list07fixed[2]);
  
  // list07fixed.add("Can cause error!");
  // 固定長度的 list ,不能增減,否則會有下面錯誤訊息!
  // Unsupported operation: Cannot add to a fixed-length list
  // (而且是在執行時期跳出錯誤,不是編譯時就發現錯誤!)
  
  Map map07={}; // map 是 key-value 
  map07["John"]=18;
  
  Map map08={"Joseph":17, "Amber":38};
  map08["Baby"]=1;
  map08["Cherry"]=6;
  map08.remove("Baby");
  var vKeys=map08.keys;
  for(int i=0; i<vKeys.length; i++)
  {
    String strKey=vKeys.elementAt(i);
    print(strKey + " -- " + map08[strKey].toString());
  }
  
  String str09='使用單引號';
  String str10="使用雙引號";
  String str11='''三個單引號可以多行喔
很神奇吧!''';
  String str12="""三個雙引號也可以多行喔
很神奇吧!""";
  
  print(str11.length);
  for(int i=0; i<str11.length; i++)
  {
    print(i.toString() + " -- " + str11[i]); // 字串可以是陣列
  }
  
  print("可以內嵌字串喔→${str09}");
  print("字串長度為→${str09.length},對吧!");
  
  Map map13={"First":"Yes"};
  final str14=map13['First'] as String;

  final String str15="final";
  final String str16;
  str16="final";
  
  const String str17="const";
  
  int i18=39;
  int i19=7;
  
  print(i18 + i19); // 46
  print(i18 - i19); // 32
  print(i18 * i19); // 273
  print(i18 / i19); // 5.571428571428571
  print(i18 ~/ i19); // 5
  print(i18 % i19); // 4
  
  i18++;
  i19--;
  if(i18==i19) { print("the same"); }
  if(i18!=i19) { print("different"); }
  
  if(i18>=i19) 
  {
    print("bigger");
  }
  else if( (i18-i19) > 20 )
  {
    print("block 2");
  }
  else
  {
    print("others");
  }
  
  // not !
  // or ||
  // and &&
  
  int iC=0;
  while(iC<5)
  {
    print(iC);
    iC++;
  }
  
  iC=0;
  do
  {
    print(iC);
    iC++;
  } while(iC<5);
  
  for(int iC=0; iC<10; iC++)
  {
    print(iC);
  }
  
  print(iC); // 5
  
  // break; continue;
  
  String strSex="male";
  switch(strSex)
  {
    case "male":
      print("male checked");
      break;
    case "female":
      print("female checked");
      break;
    default:
      break;
  }
  
}

dart04.dart

String getStrSomething(int iNumber)
{
  return "The number is ${iNumber.toString()}. ^^";
}

String getStrV02(int iNumber, [int? iVal])
{
  return iNumber.toString();
}

String getStrV03(int iNumber, [int iVal=13])
{
  return iNumber.toString()+"--"+iVal.toString();
}

void main() // 在 dart 3.0.6 底下測試
{
  print(getStrSomething(38));
  print(getStrV03(55));
  print(getStrV03(55,66));
}

dart05.dart

String getStrAddV01(int iValue1, {int iValue2=77})
{
  return (iValue1+iValue2).toString();
}

String getStrAddV02(int iValue1, {required int iValue2})
{
  return (iValue1+iValue2).toString();
}

void main() // 在 dart 3.0.6 底下測試
{
  print(getStrAddV01(38));
  print(getStrAddV01(20, iValue2:50));
  
  // print(getStrAddV02(12)); // Error: Required named parameter 'iValue2' must be provided.
  print(getStrAddV02(12, iValue2:40));
  
  // record variable
  (String, int) rec01;
  rec01=("roadLength", 12);
  
  (String, {int iLen, String strUnit}) rec02 = ("ChangEn", iLen:6, strUnit:"meters");
  print(rec02);
}

dart06.dart

(String, int, int, int) getRecDimension()
{
  return ("box", 10, 23, 20);
}

({String strName, int iD1, int iD2, int iD3}) getRecDimensionV2()
{
  return (strName:"box", iD1:10, iD2:23, iD3:20);
}

void main() // 在 dart 3.0.6 底下測試
{
  var rec1=getRecDimension();
  print(rec1.$1);
  print(rec1.$2);
  print(rec1.$3);
  print(rec1.$4);
  
  var (strName, iD1, iD2, iD3)=getRecDimension();
  print(strName);
  print(iD1);
  print(iD2);
  print(iD3);
  
  var rec2=getRecDimensionV2();
  print(rec2.strName);
  print(rec2.iD1);
  print(rec2.iD2);
  print(rec2.iD3);

  var (strName:strName2, iD1:iD12, iD2:iD22, iD3:iD32)=getRecDimensionV2();
  print(strName2);
  print(iD12);
  print(iD22);
  print(iD32);
}

dart07.dart

String getStrMessage(int iNumber)
{
  if(iNumber==1) {  return "First Item!";}
  else if(iNumber==2) { return "Second Object!"; }
  
  return iNumber.toString();
}

// 函數名稱可以當成變數使用

void main() // 在 dart 3.0.6 底下測試
{
  var theFunc=getStrMessage;
  print(theFunc(2));
}

dart08.dart

// 匿名函數

void main() // 在 dart 3.0.6 底下測試
{
  var tmpVariable01=(int iNum)=>(iNum+3).toString();
  var tmpVariable02=(int iNum) { var i2=iNum+7; print(i2.toString()); };
  var tmpVariable03=(int iNum) { return iNum*5; };
  
  print(tmpVariable01(3));
  tmpVariable02(5);
  print(tmpVariable03(4));
}

dart09.dart

// 函數

func01()
{
  print("I am function 01");
}

func02()
{
  print("I am function 02");
  func01()
  {
    print("I am function 01 inside function 02");
  }
  func01();
}

void main() // 在 dart 3.0.6 底下測試
{
  func02();
  func01();
}

// I am function 02
// I am function 01 inside function 02
// I am function 01

dart10.dart

// 類別

class CBaby1
{
  String? strName;
  String getStrHello() => "Hello, $strName!"; // 函數
}

class CBaby2
{
  String? strName;
  String get strHello => "Hello, $strName!"; // 屬性讀取
}


void main() // 在 dart 3.0.6 底下測試
{
  CBaby1 oBaby1=CBaby1();
  oBaby1.strName="John";
  print(oBaby1.getStrHello());
  
  CBaby2 oBaby2=CBaby2();
  oBaby2.strName="Amber";
  print(oBaby2.strHello);
}

dart11.dart

class CShowStatic
{
  static String strLabel = "Static Label:";
  
  String strName="default";
  void setName(strName) { this.strName=strName; }
  String getStrName() { return this.strName; }
  
  void prints()
  {
    print(CShowStatic.strLabel+" "+this.strName);
  }
  
  static void anotherPrints(CShowStatic obj1)
  {
    print(strLabel+" "+obj1.getStrName());
  }

}

void main() // 在 dart 3.0.6 底下測試
{
  var o1=CShowStatic();
  var o2=CShowStatic();
  
  o2.setName("John");
  
  o1.prints();
  o2.prints();
  
  CShowStatic.anotherPrints(o1);
  CShowStatic.anotherPrints(o2);
}

dart12.dart

class Car
{
  late String strName1;
  late String strName2;
  Car(String strName1, String strName2)
  {
    this.strName1=strName1;
    this.strName2=strName2;
  }
  String getStrFullName() => "$strName1 $strName2";
}

class AnotherCar
{
  String strName1;
  String strName2;
  AnotherCar(this.strName1, this.strName2);
  String getStrFullName() => "$strName1 $strName2";
}

void main() // 在 dart 3.0.6 底下測試
{
  Car oCar1=Car("toyota","altis");
  print(oCar1.getStrFullName());
  
  AnotherCar oCar2=AnotherCar("Toyota","Altis");
  print(oCar2.getStrFullName());
}

dart13.dart

class Car
{
  late String strName1;
  late String strName2;
  Car(String strName1, String strName2)
  {
    this.strName1=strName1;
    this.strName2=strName2;
  }
  String getStrFullName() => "$strName1 $strName2";
}

class TheCar extends Car
{
  String strNickName;
  TheCar(String strName1, String strName2, this.strNickName) : super(strName1, strName2);
  
  @override
  String getStrFullName() => "${super.getStrFullName()} aka $strNickName";
  
  // 這樣也行
  // @override
  // String getStrFullName() => "$strName1 $strName2 aka $strNickName";
}

void main() // 在 dart 3.0.6 底下測試
{
  TheCar oCar1=TheCar("toyota","altis","MyCar");
  print(oCar1.getStrFullName());
}

dart14.dart

abstract class Car
{
  String strName1;
  String strName2;
  Car(this.strName1, this.strName2);
  String getStrFullName() => "$strName1 $strName2";
}

class TheCar extends Car
{
  String strNickName;
  TheCar(String strName1, String strName2, this.strNickName) : super(strName1, strName2);
  
  @override
  String getStrFullName() => "$strName1 $strName2 aka $strNickName";
}

void main() // 在 dart 3.0.6 底下測試
{
  TheCar oCar1=TheCar("toyota","altis","MyCar");
  print(oCar1.getStrFullName());
}

dart15.dart

abstract interface class Car
{
  String getStrFullName();
}

abstract interface class Car2
{
  String getStrNickName();
}

class TheCar implements Car, Car2
{
  String strName1;
  String strName2;
  String strNickName;
  TheCar(this.strName1, this.strName2, this.strNickName);
  
  @override
  String getStrFullName() => "$strName1 $strName2 aka $strNickName";
  
  @override
  String getStrNickName() => "$strNickName";
}

void main() // 在 dart 3.0.6 底下測試
{
  TheCar oCar1=TheCar("toyota","altis","MyCar");
  print(oCar1.getStrFullName());
  print(oCar1.getStrNickName());
}

dart16.dart

class CSkill01
{
  method01()
  {
    print('I am method01');
  }
}

mixin class CSkill02
{
  method02()
  {
    print('I am method02');
  }
}

class CAll extends CSkill01 with CSkill02 // 用 mixin+with 來達成多重繼承
{
  method03()
  {
    print('I am method03');
  }
}

class COnly1 extends CSkill02 {}

void main() // 在 dart 3.0.6 底下測試
{
  CAll oA=CAll();
  oA.method01();
  oA.method02();
  oA.method03();
  
  COnly1 oO=COnly1();
  oO.method02();
}

dart17.dart

enum CarType {YARiS, CROWN, ALTIS, VIOS, CAMRY}

void main() // 在 dart 3.0.6 底下測試
{
  CarType oCT=CarType.YARiS;
  
  print(CarType.values); // [CarType.YARiS, CarType.CROWN, CarType.ALTIS, CarType.VIOS, CarType.CAMRY]
  print(oCT); // CarType.YARiS
  
  if(oCT==CarType.ALTIS) { print("ALTIS"); }
  else if(oCT==CarType.YARiS) { print("YARiS"); }
  else { print("Others"); }
}

dart18.dart

void main() // 在 dart 3.0.6 底下測試
{
  List list01=["Happy", "Good"];
  list01.add(38);
  print(list01);
  
  List<String> list02=["Happy", "Good"];
  // list02.add(38); // Error: The argument type 'int' can't be assigned to the parameter type 'String'.
  
  
  var var03=<String>["Happy", "Good"];
  var var04=<String, String?>
  {
    "key01": "value01",
    "key02": "value02",
    "kye03": null
  };
  
  print(var03);
  print(var04);
  
  var var05=<String>[];
  var05.add(38.toString());
  print(var05);
}

dart19.dart

import 'dart:io';

void function01() 
{
  for(int i=0; i<5; i++) 
  {
    sleep(Duration(seconds: 1));
    print("Index: $i");
  }
}

main() // 在 dart 3.0.6 底下測試
{
  print("call function");
  function01();
  
  print("back to main");
  for (int i=10; i<15; i++) 
  {
    sleep(Duration(seconds: 1));
    print("Index from main: $i");
  }
  
  print("The End");
}

dart20.dart

import 'dart:io';
import 'dart:async';

Future<void> function01() async
{
  for(int i=0; i<5; i++) 
  {
    await Future.delayed(Duration(seconds: 1));
    print("Index: $i");
  }
}

main() async // 在 dart 3.0.6 底下測試
{
  print("call function");
  function01();
  
  print("back to main");
  for (int i=10; i<15; i++) 
  {
    await Future.delayed(Duration(seconds: 1));
    print("Index from main: $i");
  }
  
  print("The End");
}

dart21.dart

import 'dart:io';
import 'dart:async';
import 'dart:isolate';

Future<void> function01(String strAtLeastOneParameter) async
{
  for(int i=0; i<5; i++) 
  {
    await Future.delayed(Duration(seconds: 2));
    print("$strAtLeastOneParameter: $i");
  }
}

main() async // 在 dart 3.0.6 底下測試
{
  print("call function");
  Isolate.spawn(function01, "Hello, dart, "); // 獨立的執行緒,但是,當主執行緒結束時,他也會被迫結束。
  
  print("back to main");
  for (int i=10; i<15; i++) 
  {
    await Future.delayed(Duration(seconds: 1));
    print("Index from main: $i");
  }
  
  print("The End");
}