Dart 언어 학습 노트 1

12247 단어 dart
변수 성명 1 var 는 JavaScript 의 var 와 유사 합 니 다. 모든 종류의 변 수 를 받 아들 일 수 있 지만 가장 큰 차이 점 은 Dart 에서 var 변수 가 할당 되면 유형 이 확정 되 고 그 유형 을 바 꿀 수 없습니다. 예 를 들 어:
	var t;
	t="hi world";
	//      dart    ,    t        String,
	//                 。
	t=1000;

위의 코드 는 JavaScript 에 문제 가 없습니다. 전단 개발 자 는 주의해 야 합 니 다. 이 차이 가 있 는 이 유 는 Dart 자체 가 강 한 유형 언어 이기 때 문 입 니 다. 모든 변 수 는 유형 이 정 해 져 있 습 니 다. Dart 에서 var 로 변 수 를 설명 한 후에 Dart 는 컴 파일 할 때 첫 번 째 할당 데이터 의 유형 에 따라 그 유형 을 추정 합 니 다.컴 파일 이 끝 난 후에 그 유형 은 이미 확정 되 었 고 자바 스 크 립 트 는 순수한 약 한 유형의 스 크 립 트 언어 입 니 다. var 는 변수의 성명 방식 일 뿐 입 니 다.
2 dynamic 과 Object Dynamic 과 Object 는 var 기능 과 비슷 하여 값 을 부여 할 때 자동 으로 유형 을 추정 합 니 다. 다른 것 은 값 을 부여 한 후에 그 유형 을 바 꿀 수 있 습 니 다. 예 를 들 어:
	dynamic t;
	t="hi world";
	//        
	t=1000;

Object 는 dart 모든 대상 의 기본 클래스 입 니 다. 즉, 모든 유형 이 Object 의 하위 클래스 이기 때문에 모든 유형의 데 이 터 는 Object 성명 의 대상 에 게 할당 할 수 있 기 때문에 표현 효 과 는 다이나믹 과 비슷 합 니 다.
3 final 과 const 변 수 를 변경 하지 않 으 려 면 final 이나 const 를 사용 하 십시오. var 도 아니 고 유형 도 아 닙 니 다.하나의 final 변 수 는 한 번 만 설정 할 수 있 습 니 다. 두 가지 차이 점 은 const 변 수 는 컴 파일 할 때 상수 이 고 final 변 수 는 처음 사용 할 때 초기 화 됩 니 다.final 또는 const 에 의 해 수 정 된 변 수 는 변수 형식 을 생략 할 수 있 습 니 다. 예 를 들 어:
	//    String      
	final str = "hi world";
	//final str = "hi world"; 
	const str1 = "hi world";
	//const String str1 = "hi world";


함수 Dart 는 진정한 대상 을 대상 으로 하 는 언어 이기 때문에 함수 도 대상 이 고 하나의 유형 Function 이 있 습 니 다.이것 은 함수 가 변수 에 값 을 부여 하거나 매개 변수 로 다른 함수 에 전달 할 수 있다 는 것 을 의미 하 는데 이것 은 함수 식 프로 그래 밍 의 전형 적 인 특징 이다.
1 함수 선언
	bool isNoble(int atomicNumber) {
   		 return _nobleGases[atomicNumber] != null;
  	}

dart 함수 성명 반환 값 형식 이 표시 되 지 않 으 면 기본적으로 다이나믹 처리 로 사 용 됩 니 다. 함수 반환 값 은 형식 추정 이 없습니다.
 	typedef bool CALLBACK();

   	//       ,     dynamic,  bool
   	isNoble(int atomicNumber) {
   	  return _nobleGases[atomicNumber] != null;
   	}
   	
   	void test(CALLBACK cb){
   	   print(cb()); 
   	}
   	//  ,isNoble  bool  
   	test(isNoble);

2. 하나의 표현 식 만 포함 하 는 함수 에 대해 서 는 약자 문법 을 사용 할 수 있 습 니 다.
	bool isNoble (int atomicNumber )=> _nobleGases [ atomicNumber ] != null ;

3 함수 변수 로
	var say= (str){
	  print(str);
	};
	say("hi world");

4 함수 매개 변수 로 전달
	void execute(var callback){
	    callback();
	}
	execute(()=>print("xxx"))

5 선택 가능 한 위치 매개 변수
함수 매개 변 수 를 포장 하고 [] 로 선택 가능 한 위치 매개 변수 로 표시 합 니 다.
	String say(String from, String msg, [String device]) {
	  	var result = '$from says $msg';
	 if (device != null) {
	    result = '$result with a $device';
	  }
	  	return result;
}

다음은 선택 할 수 있 는 인자 가 없 는 이 함수 의 예 입 니 다.
	say('Bob', 'Howdy'); //   : Bob says Howdy

다음은 세 번 째 매개 변수 로 이 함 수 를 호출 하 는 예 입 니 다.
	say('Bob', 'Howdy', 'smoke signal'); //   :Bob says Howdy with a smoke signal

6. 선택 할 수 있 는 이름 매개 변수 정의 함수 일 때 {param 1, param 2,...} 을 사용 하여 이름 매개 변 수 를 지정 합 니 다.예 를 들 면:
	//  [bold] [hidden]  
	void enableFlags({bool bold, bool hidden}) {
	    // ... 
	}

함 수 를 호출 할 때 지정 한 이름 인 자 를 사용 할 수 있 습 니 다.paramName: value
	enableFlags(bold: true, hidden: false);

선택 가능 한 이름 매개 변 수 는 Flutter 에서 매우 많이 사 용 됩 니 다.


비동기 지원 Dart 라 이브 러 리 는 Future 나 Stream 대상 으로 돌아 가 는 함수 가 매우 많 습 니 다.이 함수 들 은 비동기 함수 라 고 불 린 다. 예 를 들 어 IO 작업 과 같은 시간 소모 작업 을 설정 한 후에 돌아 올 뿐이다.이 조작 이 끝 날 때 까지 기다 리 는 것 이 아니다.
async 와 await 키 워드 는 비동기 프로 그래 밍 을 지원 합 니 다. 동기 코드 와 비슷 한 비동기 코드 를 실행 합 니 다.


Future Future 는 JavaScript 의 Promise 와 매우 비슷 하여 비동기 작업 의 최종 완성 (또는 실패) 과 그 결과 값 을 나타 낸다.쉽게 말 하면 비동기 작업 을 처리 하 는 데 사 용 됩 니 다. 비동기 처리 가 성공 하면 성공 적 인 작업 을 수행 하고 비동기 처리 가 실패 하면 오 류 를 포착 하거나 후속 작업 을 중단 합 니 다.하나의 Future 는 하나의 결과 에 만 대응 할 수 있 습 니 다. 성공 하거나 실패 할 수 있 습 니 다.
자체 의 기능 이 비교적 많 기 때문에, 여기 서 우 리 는 자주 사용 하 는 API 와 특성 만 소개 한다.그리고 Future 의 모든 API 의 반환 값 은 여전히 Future 대상 이기 때문에 체인 호출 이 편리 하 다 는 것 을 기억 하 세 요.


Future. then 은 예 시 를 편리 하 게 하기 위해 이 예 에서 우 리 는 Future. delayd 를 사용 하여 지연 작업 (실제 장면 은 네트워크 요청 과 같은 진정한 시간 소모 작업 일 것 입 니 다) 을 만 들 었 습 니 다. 즉, 2 초 후에 결과 문자열 인 'hi World!' 를 되 돌려 준 다음 에 우 리 는 then 에서 비동기 결 과 를 받 고 결 과 를 인쇄 합 니 다. 코드 는 다음 과 같 습 니 다.
	Future.delayed(new Duration(seconds: 2),(){
	   return "hi world!";
	}).then((data){
	   print(data);
	});	


Future. catch Error 비동기 작업 에 오류 가 발생 하면 catch Error 에서 오 류 를 포착 할 수 있 습 니 다. 위의 예 시 를 다음 으로 바 꿉 니 다.
	Future.delayed(new Duration(seconds: 2),(){
	   //return "hi world!";
	   throw AssertionError("Error");  
	}).then((data){
	   //           
	   print("success");
	}).catchError((e){
	   //           
	   print(e);
	});

이 예제 에서 우 리 는 비동기 작업 에서 이상 을 던 졌 습 니 다. then 의 리 셋 함 수 는 실행 되 지 않 을 것 입 니 다. 대신 catch Error 리 셋 함수 가 호출 될 것 입 니 다.그러나 catchError 리 셋 만 오 류 를 포착 할 수 있 는 것 이 아 닙 니 다. then 방법 은 선택 할 수 있 는 인자 인 onError 가 있 습 니 다. 우 리 는 이것 을 통 해 이상 을 포착 할 수 있 습 니 다.
	Future.delayed(new Duration(seconds: 2), () {
	    //return "hi world!";
	    throw AssertionError("Error");
	}).then((data) {
	    print("success");
	}, onError: (e) {
	    print(e);
	});


Future. whenComplete 는 가끔 비동기 작업 이 성공 하거나 실패 하 더 라 도 뭔 가 를 해 야 하 는 장면 을 만 날 수 있 습 니 다. 예 를 들 어 네트워크 요청 전에 불 러 오기 대화 상 자 를 팝 업 하고 요청 이 끝 난 후에 대화 상 자 를 닫 습 니 다.이 장면 은 두 가지 방법 이 있 습 니 다. 첫 번 째 는 then 이나 catch 에서 대화 상 자 를 닫 는 것 입 니 다. 두 번 째 는 Future 의 whenComplete 리 셋 을 사용 하 는 것 입 니 다. 우 리 는 위의 예 시 를 바 꾸 겠 습 니 다.
	Future.delayed(new Duration(seconds: 2),(){
	   //return "hi world!";
	   throw AssertionError("Error");
	}).then((data){
	   //          
	   print(data);
	}).catchError((e){
	   //            
	   print(e);
	}).whenComplete((){
	   //             
	});


Future. wait 어떤 때 는 여러 개의 비동기 작업 이 모두 끝 난 후에 야 작업 을 해 야 합 니 다. 예 를 들 어 우 리 는 하나의 인터페이스 가 있 습 니 다. 먼저 두 개의 네트워크 인터페이스 에서 데 이 터 를 얻 고 성공 한 후에 우 리 는 두 개의 인터페이스 데 이 터 를 특정한 처 리 를 한 후에 UI 인터페이스 에 표시 해 야 합 니 다. 어떻게 해 야 합 니까?정 답 은 Future. wait 입 니 다. Future 배열 의 인 자 를 받 아들 입 니 다. 배열 의 모든 Future 가 성공 한 후에 야 then 의 성공 적 인 리 셋 을 촉발 할 수 있 습 니 다. Future 실행 에 실패 하면 오류 리 셋 을 촉발 할 수 있 습 니 다.다음 에 우 리 는 Future. delayd 를 모 의 해서 두 데이터 로 얻 은 비동기 작업 을 모 의 합 니 다. 두 비동기 작업 이 모두 성공 할 때 두 비동기 작업 의 결 과 를 연결 하여 인쇄 합 니 다. 코드 는 다음 과 같 습 니 다.
	Future.wait([
	  // 2        
	  Future.delayed(new Duration(seconds: 2), () {
	    return "hello";
	  }),
	  // 4        
	  Future.delayed(new Duration(seconds: 4), () {
	    return " world";
	  })
	]).then((results){
	  print(results[0]+results[1]);
	}).catchError((e){
	  print(e);
	});

위의 코드 를 실행 하면 4 초 후에 콘 솔 에서 'hello World' 를 볼 수 있 습 니 다.


Async / await Dart 의 async / await 와 JavaScript 의 async / await 기능 과 용법 이 똑 같 습 니 다. JavaScript 의 async / await 용법 을 알 고 있다 면 이 절 을 직접 건 너 뛸 수 있 습 니 다.

(Callback hell)

, , Future.then 。 , , Id, Id, , , , , :
	//           
	Future login(String userName, String pwd){
	    ...
	    //    
	};
	Future getUserInfo(String id){
	    ...
	    //       
	};
	Future saveUserInfo(String userInfo){
	    ...
	    //        
	};

, :

	login("alice","******").then((id){
	 //       ,id          
	 getUserInfo(id).then((userInfo){
	    //          
	    saveUserInfo(userInfo).then((){
	       //      ,         
	        ...
	    });
	  });
	})

, , , , , (Callback hell)。 JavaScript , JavaScript , ECMAScript6 ECMAScript7 , , ECMAScript6 Promise, ECMAScript7 async/await。 Dart JavaScript :Future Promise, async/await 。 Future async/await 。

Future callback hell

	login("alice","******").then((id){
	      return getUserInfo(id);
	}).then((userInfo){
	    return saveUserInfo(userInfo);
	}).then((e){
	   //         
	}).catchError((e){
	  //      
	  print(e);
	});

, “Future API Future , ” , then Future , future , then , , 。

async/await callback hell

Future Future , , ? , async/await , , , :
	task() async {
	   try{
	    String id = await login("alice","******");
	    String userInfo = await getUserInfo(id);
	    await saveUserInfo(userInfo);
	    //           
	   } catch(e){
	    //       
	    print(e);   
	   }  
	}

async , Future , then 。
await Future, , ;await async 。

, async/await 。

	  ,    JavaScript  Dart ,async/await        ,                  	Promise(Future)    。

Stream

Stream , Future , ( )。 , , 。 Stream , 、 。 :
	Stream.fromFutures([
	  // 1      
	  Future.delayed(new Duration(seconds: 1), () {
	    return "hello 1";
	  }),
	  //       
	  Future.delayed(new Duration(seconds: 2),(){
	    throw AssertionError("Error");
	  }),
	  // 3      
	  Future.delayed(new Duration(seconds: 3), () {
	    return "hello 3";
	  })
	]).listen((data){
	   print(data);
	}, onError: (e){
	   print(e.message);
	},onDone: (){
	
	});

	I/flutter (17666): hello 1
	I/flutter (17666): Error
	I/flutter (17666): hello 3

, 。

    :  Stream        ,     Stream               ?

Dart Java JavaScript , , , Dart Java JavaScript。

Dart vs Java

,Dart Java ; VM ,Dart VM , , , , Dart ,VM , Google go( vm GC)、javascript(v8)、dalvik(android java vm) 。 Dart Flutter GC 10ms , Dart Java , 。 ,Dart java , Dart Java( lamda ), Dart , , Flutter , Dart , Dart , 。

Dart vs JavaScript

JavaScript , TypeScript、Coffeescript Facebook flow( JavaScript , ) 。 ( Python、PHP),JavaScript , JavaScript , , JavaScript , 。 , ,JavaScript , , JavaScript , , 。 , , 。 , Flutter ,Dart , 、 。 Dart 2.0 (Strong Mode), (checked mode) (optional type) , ,Dart TypeScript、Coffeescript , ,Dart , ,dart 、APP 、web , !

, Dart , , , , , , , , 。

좋은 웹페이지 즐겨찾기